Clean the environment.

Set locations, and the working directory …


Defining phenotypes and datasets.

Create a new analysis directory, including subdirectories.
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE

Setting working directory and listing its contents.
[1] "/Users/slaan3/OneDrive - UMC Utrecht/PLINK/analyses/lookups/AE_20200512_COL_MKAVOUSI_MBOS_CHARGE_1000G_CAC/scRNAseq"
[1] "AESCRNA"          "scRNAseq.nb.html" "scRNAseq.Rmd"    

… a package-installation function …

… and load those packages.

Loading required package: readr
Loading required package: optparse
Loading required package: tools
Loading required package: dplyr

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

Loading required package: tidyr
Loading required package: tidylog

Attaching package: ‘tidylog’

The following objects are masked from ‘package:tidyr’:

    drop_na, fill, gather, pivot_longer, pivot_wider, replace_na, spread, uncount

The following objects are masked from ‘package:dplyr’:

    add_count, add_tally, anti_join, count, distinct, distinct_all, distinct_at, distinct_if, filter, filter_all,
    filter_at, filter_if, full_join, group_by, group_by_all, group_by_at, group_by_if, inner_join, left_join, mutate,
    mutate_all, mutate_at, mutate_if, relocate, rename, rename_all, rename_at, rename_if, rename_with, right_join,
    sample_frac, sample_n, select, select_all, select_at, select_if, semi_join, slice, slice_head, slice_max, slice_min,
    slice_sample, slice_tail, summarise, summarise_all, summarise_at, summarise_if, summarize, summarize_all,
    summarize_at, summarize_if, tally, top_frac, top_n, transmute, transmute_all, transmute_at, transmute_if, ungroup

The following object is masked from ‘package:stats’:

    filter

Loading required package: naniar
data.table 1.14.0 using 1 threads (see ?getDTthreads).  Latest news: r-datatable.com
**********
This installation of data.table has not detected OpenMP support. It should still work but in single-threaded mode.
This is a Mac. Please read https://mac.r-project.org/openmp/. Please engage with Apple and ask them for support. Check r-datatable.com for updates, and our Mac instructions here: https://github.com/Rdatatable/data.table/wiki/Installation. After several years of many reports of installation problems on Mac, it's time to gingerly point out that there have been no similar problems on Windows or Linux.
**********

Attaching package: ‘data.table’

The following objects are masked from ‘package:dplyr’:

    between, first, last

Loading required package: tidyverse
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
Registered S3 method overwritten by 'cli':
  method     from         
  print.boxx spatstat.geom
── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ stringr 1.4.0
✓ tibble  3.1.2     ✓ forcats 0.5.1
✓ purrr   0.3.4     
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x tidylog::add_count()     masks dplyr::add_count()
x tidylog::add_tally()     masks dplyr::add_tally()
x tidylog::anti_join()     masks dplyr::anti_join()
x data.table::between()    masks dplyr::between()
x tidylog::count()         masks dplyr::count()
x tidylog::distinct()      masks dplyr::distinct()
x tidylog::distinct_all()  masks dplyr::distinct_all()
x tidylog::distinct_at()   masks dplyr::distinct_at()
x tidylog::distinct_if()   masks dplyr::distinct_if()
x tidylog::drop_na()       masks tidyr::drop_na()
x tidylog::fill()          masks tidyr::fill()
x tidylog::filter()        masks dplyr::filter(), stats::filter()
x tidylog::filter_all()    masks dplyr::filter_all()
x tidylog::filter_at()     masks dplyr::filter_at()
x tidylog::filter_if()     masks dplyr::filter_if()
x data.table::first()      masks dplyr::first()
x tidylog::full_join()     masks dplyr::full_join()
x tidylog::gather()        masks tidyr::gather()
x tidylog::group_by()      masks dplyr::group_by()
x tidylog::group_by_all()  masks dplyr::group_by_all()
x tidylog::group_by_at()   masks dplyr::group_by_at()
x tidylog::group_by_if()   masks dplyr::group_by_if()
x tidylog::inner_join()    masks dplyr::inner_join()
x dplyr::lag()             masks stats::lag()
x data.table::last()       masks dplyr::last()
x tidylog::left_join()     masks dplyr::left_join()
x tidylog::mutate()        masks dplyr::mutate()
x tidylog::mutate_all()    masks dplyr::mutate_all()
x tidylog::mutate_at()     masks dplyr::mutate_at()
x tidylog::mutate_if()     masks dplyr::mutate_if()
x tidylog::pivot_longer()  masks tidyr::pivot_longer()
x tidylog::pivot_wider()   masks tidyr::pivot_wider()
x tidylog::relocate()      masks dplyr::relocate()
x tidylog::rename()        masks dplyr::rename()
x tidylog::rename_all()    masks dplyr::rename_all()
x tidylog::rename_at()     masks dplyr::rename_at()
x tidylog::rename_if()     masks dplyr::rename_if()
x tidylog::rename_with()   masks dplyr::rename_with()
x tidylog::replace_na()    masks tidyr::replace_na()
x tidylog::right_join()    masks dplyr::right_join()
x tidylog::sample_frac()   masks dplyr::sample_frac()
x tidylog::sample_n()      masks dplyr::sample_n()
x tidylog::select()        masks dplyr::select()
x tidylog::select_all()    masks dplyr::select_all()
x tidylog::select_at()     masks dplyr::select_at()
x tidylog::select_if()     masks dplyr::select_if()
x tidylog::semi_join()     masks dplyr::semi_join()
x tidylog::slice()         masks dplyr::slice()
x tidylog::slice_head()    masks dplyr::slice_head()
x tidylog::slice_max()     masks dplyr::slice_max()
x tidylog::slice_min()     masks dplyr::slice_min()
x tidylog::slice_sample()  masks dplyr::slice_sample()
x tidylog::slice_tail()    masks dplyr::slice_tail()
x tidylog::spread()        masks tidyr::spread()
x tidylog::summarise()     masks dplyr::summarise()
x tidylog::summarise_all() masks dplyr::summarise_all()
x tidylog::summarise_at()  masks dplyr::summarise_at()
x tidylog::summarise_if()  masks dplyr::summarise_if()
x tidylog::summarize()     masks dplyr::summarize()
x tidylog::summarize_all() masks dplyr::summarize_all()
x tidylog::summarize_at()  masks dplyr::summarize_at()
x tidylog::summarize_if()  masks dplyr::summarize_if()
x tidylog::tally()         masks dplyr::tally()
x tidylog::top_frac()      masks dplyr::top_frac()
x tidylog::top_n()         masks dplyr::top_n()
x tidylog::transmute()     masks dplyr::transmute()
x tidylog::transmute_all() masks dplyr::transmute_all()
x tidylog::transmute_at()  masks dplyr::transmute_at()
x tidylog::transmute_if()  masks dplyr::transmute_if()
x purrr::transpose()       masks data.table::transpose()
x tidylog::uncount()       masks tidyr::uncount()
x tidylog::ungroup()       masks dplyr::ungroup()
Loading required package: knitr
Loading required package: DT
Loading required package: org.Hs.eg.db
Loading required package: AnnotationDbi
Loading required package: stats4
Loading required package: BiocGenerics
Loading required package: parallel

Attaching package: ‘BiocGenerics’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ, clusterExport, clusterMap, parApply, parCapply, parLapply,
    parLapplyLB, parRapply, parSapply, parSapplyLB

The following objects are masked from ‘package:dplyr’:

    combine, intersect, setdiff, union

The following objects are masked from ‘package:stats’:

    IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

    anyDuplicated, append, as.data.frame, basename, cbind, colnames, dirname, do.call, duplicated, eval, evalq, Filter,
    Find, get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply, match, mget, order, paste, pmax, pmax.int, pmin,
    pmin.int, Position, rank, rbind, Reduce, rownames, sapply, setdiff, sort, table, tapply, union, unique, unsplit,
    which.max, which.min

Loading required package: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with 'browseVignettes()'. To cite Bioconductor, see
    'citation("Biobase")', and for packages 'citation("pkgname")'.

Loading required package: IRanges
Loading required package: S4Vectors

Attaching package: ‘S4Vectors’

The following objects are masked from ‘package:data.table’:

    first, second

The following object is masked from ‘package:tidylog’:

    rename

The following object is masked from ‘package:tidyr’:

    expand

The following objects are masked from ‘package:dplyr’:

    first, rename

The following objects are masked from ‘package:base’:

    expand.grid, I, unname


Attaching package: ‘IRanges’

The following object is masked from ‘package:purrr’:

    reduce

The following object is masked from ‘package:data.table’:

    shift

The following object is masked from ‘package:tidylog’:

    slice

The following objects are masked from ‘package:dplyr’:

    collapse, desc, slice


Attaching package: ‘AnnotationDbi’

The following object is masked from ‘package:tidylog’:

    select

The following object is masked from ‘package:dplyr’:

    select


Loading required package: mygene
Loading required package: GenomicFeatures
Loading required package: GenomeInfoDb
Loading required package: GenomicRanges
Loading required package: EnhancedVolcano
Loading required package: ggrepel
Registered S3 methods overwritten by 'ggalt':
  method                  from   
  grid.draw.absoluteGrob  ggplot2
  grobHeight.absoluteGrob ggplot2
  grobWidth.absoluteGrob  ggplot2
  grobX.absoluteGrob      ggplot2
  grobY.absoluteGrob      ggplot2
Loading required package: haven
Loading required package: tableone
Loading required package: devtools
Loading required package: usethis
Attaching SeuratObject

Attaching package: ‘Seurat’

The following object is masked from ‘package:DT’:

    JS

We will create a datestamp and define the Utrecht Science Park Colour Scheme.

1 ERA-CVD ‘druggable-MI-targets’

For the ERA-CVD ‘druggable-MI-targets’ project (grantnumber: 01KL1802) we will perform two related RNA sequencing (RNAseq) experiments:

  1. conventional (‘bulk’) RNAseq using RNA extracted from carotid plaque samples, n ± 700. As of Friday, July 16, 2021 all samples have been selected and RNA has been extracted; quality control (QC) was performed and we have a dataset of 635 samples.

  2. single-cell RNAseq (scRNAseq) of at least n = 40 samples (20 females, 20 males). As of Friday, July 16, 2021 data is available of 40 samples (3 females, 15 males), we are extending sampling to get more female samples.

Plaque samples are derived from carotid endarterectomies as part of the Athero-Express Biobank Study which is an ongoing study in the UMC Utrecht.

2 Background

Here we map the CHARGE Consortium 1000G GWAS on coronary artery calcification (CAC) susceptibility loci to the single-cell carotid plaque data. These are given in:

  • IndSigSNPsforSander.xlsx
  • GeneList_15042020.xlsx
library(openxlsx)

CAC_gene_list <- read.xlsx(paste0(PROJECT_loc, "/SNP/Genes.xlsx"))

CAC_variants <- read.xlsx(paste0(PROJECT_loc, "/SNP/Variants.xlsx"))


DT::datatable(CAC_gene_list)

DT::datatable(CAC_variants)
NA

We will construct a list of genes to map to our scRNAseq data.


target_genes <- unlist(CAC_gene_list$Gene)
target_genes
 [1] "C6orf195"     "EDN1"         "PHACTR1"      "TBC1D7"       "GFOD1"        "ENPP1"        "ENPP3"        "IGFBP3"      
 [9] "AC011294.3"   "MTAP"         "RP11-145E5.5" "C9orf53"      "CDKN2A"       "CDKN2B"       "ZNF485"       "ZNF32"       
[17] "AL137026.1"   "ARID5B"       "RTKN2"        "CAMK2G"       "VCL"          "AP3M1"        "ADK"          "KAT6B"       
[25] "DUPD1"        "DUSP13"       "SAMD8"        "VDAC2"        "COMTD1"       "FGF23"        "COL4A1"       "COL4A2"      
[33] "CHRNA5"       "CHRNB4"       "ADAMTS7"      "MORF4L1"      "CTSH"         "BCAM"         "PVRL2"        "TOMM40"      
[41] "APOE"         "APOC1"       

3 Load data

First we will load the data:

  • scRNAseq experimental data and rename the cell types.
  • Athero-Express clinical data.

3.1 AESCRNA: single-cell RNAseq from carotid plaques

Here we load the latest dataset from our Athero-Express Single Cell RNA experiment.


scRNAseqData <- readRDS(paste0(RAWDATA, "/Seuset_40_patients/20210217_PlaqView_38_pts.RDS"))
scRNAseqData
An object of class Seurat 
38835 features across 6191 samples within 2 assays 
Active assay: SCT (18283 features, 3000 variable features)
 1 other assay present: RNA
 2 dimensional reductions calculated: pca, umap

The naming/classification is based on a combination conventional markers. We do not claim to know the exact identity of each cell, rather we refer to cells as ‘KIT+ Mast cells"-like cells. Likewise we refer to the cell clusters as ’communities’ of cells that exihibit similar properties, i.e. similar defining markers (e.g. KIT).

We will rename the cell types to human readable names.

### change names for clarity
# backup.scRNAseqData = scRNAseqData
# get the old names to change to new names
UMAPPlot(backup.scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident")


levels(unique(backup.scRNAseqData@active.ident))
 [1] "CD3+CD8A+ T cells I"         "CD3+CD8A+ T cells III"       "CD3+CD4+ T Cells I"          "CD14+CD68+ Macrophages I"   
 [5] "Mixed Cells I"               "CD3+CD8A+ T Cells II"        "CD14+CD68+ Macrophages II"   "CD3+CD4+ T Cells II"        
 [9] "ACTA2+ Smooth Muscle Cells"  "CD34+ Endothelial Cells I"   "CD34+ Endothelial Cells II"  "NCAM1+ Natural Killer Cells"
[13] "Mixed Cells II"              "CD79A+ B Cells I"            "CD14+CD68+ Macrophages III"  "CD3+ Regulatory T Cells"    
[17] "KIT+ Mast Cells"             "CD79A+ B Cells II"          
# "CD3+CD8A+ T cells I"         "CD3+CD8A+ T cells III"       "CD3+CD4+ T Cells I"          "CD14+CD68+ Macrophages I"   
# "Mixed Cells I"               "CD3+CD8A+ T Cells II"        "CD14+CD68+ Macrophages II"   "CD3+CD4+ T Cells II"        
# "ACTA2+ Smooth Muscle Cells"  "CD34+ Endothelial Cells I"   "CD34+ Endothelial Cells II"  "NCAM1+ Natural Killer Cells"
# "Mixed Cells II"              "CD79A+ B Cells I"            "CD14+CD68+ Macrophages III"  "CD3+ Regulatory T Cells"    
# "KIT+ Mast Cells"             "CD79A+ B Cells II" 

celltypes <- c("CD14+CD68+ Macrophages I" = "CD14+CD68+ M I", 
               "CD14+CD68+ Macrophages II" = "CD14+CD68+ M II", 
               "CD14+CD68+ Macrophages III" = "CD14+CD68+ M III",
               "CD3+CD8A+ T cells I" = "CD3+CD8A+ T I",
               "CD3+CD8A+ T Cells II" = "CD3+CD8A+ T II ", 
               "CD3+CD8A+ T cells III" = "CD3+CD8A+ T III", 
               "CD3+CD4+ T Cells I" = "CD3+CD4+ T I", 
               "CD3+CD4+ T Cells II" = "CD3+CD4+ T II", 
               "CD3+ Regulatory T Cells" = "CD3+ Treg", 
               "CD34+ Endothelial Cells I" = "CD34+ EC I", 
               "CD34+ Endothelial Cells II" = "CD34+ EC II", 
               "Mixed Cells I" = "Mixed I", 
               "Mixed Cells II" = "Mixed II", 
               "ACTA2+ Smooth Muscle Cells" = "ACTA2+ SMC", 
               "NCAM1+ Natural Killer Cells" = "NCAM1+ NK", 
               "KIT+ Mast Cells" = "KIT+ MC",
               "CD79A+ B Cells I" = "CD79A+ B I", 
               "CD79A+ B Cells II" = "CD79A+ B II")

scRNAseqData <- Seurat::RenameIdents(object = backup.scRNAseqData, 
                                       celltypes)
UMAPPlot(scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident")

UMAPPlot(scRNAseqData, label = TRUE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)

3.2 Athero-Express Biobank Study: clinical data

Loading Athero-Express clinical data.

require(haven)

# AEDB <- haven::read_sav(paste0(AEDB_loc, "/2019-3NEW_AtheroExpressDatabase_ScientificAE_02072019_IC_added.sav"))
AEDB <- haven::read_sav(paste0(AEDB_loc, "/2020_1_NEW_AtheroExpressDatabase_ScientificAE_16-03-2020.sav"))

3.2.1 Fix clinical data

We need to be very strict in defining symptoms. Therefore we will fix a new variable that groups symptoms at inclusion.

Coding of symptoms is as follows:

  • missing -999
  • Asymptomatic 0
  • TIA 1
  • minor stroke 2
  • Major stroke 3
  • Amaurosis fugax 4
  • Four vessel disease 5
  • Vertebrobasilary TIA 7
  • Retinal infarction 8
  • Symptomatic, but aspecific symtoms 9
  • Contralateral symptomatic occlusion 10
  • retinal infarction 11
  • armclaudication due to occlusion subclavian artery, CEA needed for bypass 12
  • retinal infarction + TIAs 13
  • Ocular ischemic syndrome 14
  • ischemisch glaucoom 15
  • subclavian steal syndrome 16
  • TGA 17

We will group as follows:

  1. Asymptomatic > 0
  2. TIA > 1, 7, 13
  3. Stroke > 2, 3
  4. Ocular > 4, 14, 15
  5. Retinal infarction > 8, 11
  6. Other > 5, 9, 10, 12, 16, 17

# Fix symptoms

attach(AEDB)
AEDB[,"Symptoms.5G"] <- NA
AEDB$Symptoms.5G[sympt == 0] <- "Asymptomatic"
AEDB$Symptoms.5G[sympt == 1 | sympt == 7 | sympt == 13] <- "TIA"
AEDB$Symptoms.5G[sympt == 2 | sympt == 3] <- "Stroke"
AEDB$Symptoms.5G[sympt == 4 | sympt == 14 | sympt == 15 ] <- "Ocular"
AEDB$Symptoms.5G[sympt == 8 | sympt == 11] <- "Retinal infarction"
AEDB$Symptoms.5G[sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Other"


# AsymptSympt
AEDB[,"AsymptSympt"] <- NA
AEDB$AsymptSympt[sympt == -999] <- NA
AEDB$AsymptSympt[sympt == 0] <- "Asymptomatic"
AEDB$AsymptSympt[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3] <- "Symptomatic"
AEDB$AsymptSympt[sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Ocular and others"

# AsymptSympt
AEDB[,"AsymptSympt2G"] <- NA
AEDB$AsymptSympt2G[sympt == -999] <- NA
AEDB$AsymptSympt2G[sympt == 0] <- "Asymptomatic"
AEDB$AsymptSympt2G[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3 | sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Symptomatic"

detach(AEDB)

# table(AEDB$sympt, useNA = "ifany")
# table(AEDB$AsymptSympt2G, useNA = "ifany")
# table(AEDB$Symptoms.5G, useNA = "ifany")
# 
# table(AEDB$AsymptSympt2G, AEDB$sympt, useNA = "ifany")
# table(AEDB$Symptoms.5G, AEDB$sympt, useNA = "ifany")
table(AEDB$AsymptSympt2G, AEDB$Symptoms.5G, useNA = "ifany")
              
               Asymptomatic Ocular Other Retinal infarction Stroke  TIA <NA>
  Asymptomatic          333      0     0                  0      0    0    0
  Symptomatic             0    416   119                 43    732 1045    0
  <NA>                    0      0     0                  0      0    0 1103
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "sympt", "Symptoms.5G", "AsymptSympt"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# table(AEDB.temp$Symptoms.5G, AEDB.temp$AsymptSympt)
# 
# rm(AEDB.temp)

We will also fix the plaquephenotypes variable.

Coding of symptoms is as follows:

  • missing -999
  • not relevant -888
  • fibrous 1
  • fibroatheromatous 2
  • atheromatous 3

# Fix plaquephenotypes
attach(AEDB)
AEDB[,"OverallPlaquePhenotype"] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == 1] <- "fibrous"
AEDB$OverallPlaquePhenotype[plaquephenotype == 2] <- "fibroatheromatous"
AEDB$OverallPlaquePhenotype[plaquephenotype == 3] <- "atheromatous"
detach(AEDB)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "plaquephenotype", "OverallPlaquePhenotype"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the diabetes status variable.


# Fix diabetes
attach(AEDB)
AEDB[,"DiabetesStatus"] <- NA
AEDB$DiabetesStatus[DM.composite == -999] <- NA
AEDB$DiabetesStatus[DM.composite == 0] <- "Control (no Diabetes Dx/Med)"
AEDB$DiabetesStatus[DM.composite == 1] <- "Diabetes"
detach(AEDB)

table(AEDB$DM.composite, AEDB$DiabetesStatus)
   
    Control (no Diabetes Dx/Med) Diabetes
  0                         2764        0
  1                            0      985
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the smoking status variable. We are interested in whether someone never, ever or is currently (at the time of inclusion) smoking. This is based on the questionnaire.

  • diet801: are you a smoker?
  • diet802: did you smoke in the past?

We already have some variables indicating smoking status:

  • SmokingReported: patient has reported to smoke.
  • SmokingYearOR: smoking in the year of surgery?
  • SmokerCurrent: currently smoking?
require(labelled)
Loading required package: labelled
AEDB$diet801 <- to_factor(AEDB$diet801)
AEDB$diet802 <- to_factor(AEDB$diet802)
AEDB$diet805 <- to_factor(AEDB$diet805)
AEDB$SmokingReported <- to_factor(AEDB$SmokingReported)
AEDB$SmokerCurrent <- to_factor(AEDB$SmokerCurrent)
AEDB$SmokingYearOR <- to_factor(AEDB$SmokingYearOR)

# table(AEDB$diet801)
# table(AEDB$diet802)
# table(AEDB$SmokingReported)
# table(AEDB$SmokerCurrent)
# table(AEDB$SmokingYearOR)
# table(AEDB$SmokingReported, AEDB$SmokerCurrent, useNA = "ifany", dnn = c("Reported smoking", "Current smoker"))
# 
# table(AEDB$diet801, AEDB$diet802, useNA = "ifany", dnn = c("Smoker", "Past smoker"))

cat("\nFixing smoking status.\n")

Fixing smoking status.
attach(AEDB)
AEDB[,"SmokerStatus"] <- NA
AEDB$SmokerStatus[diet802 == "don't know"] <- "Never smoked"
AEDB$SmokerStatus[diet802 == "I still smoke"] <- "Current smoker"
AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "no"] <- "Never smoked"
AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "yes"] <- "Ex-smoker"
AEDB$SmokerStatus[SmokerCurrent == "yes"] <- "Current smoker"
AEDB$SmokerStatus[SmokerCurrent == "no data available/missing"] <- NA
# AEDB$SmokerStatus[is.na(SmokerCurrent)] <- "Never smoked"
detach(AEDB)

cat("\n* Current smoking status.\n")

* Current smoking status.
table(AEDB$SmokerCurrent,
      useNA = "ifany", 
      dnn = c("Current smoker"))
Current smoker
no data available/missing                        no                       yes                      <NA> 
                        0                      2364                      1308                       119 
cat("\n* Updated smoking status.\n")

* Updated smoking status.
table(AEDB$SmokerStatus,
      useNA = "ifany", 
      dnn = c("Updated smoking status"))
Updated smoking status
Current smoker      Ex-smoker   Never smoked           <NA> 
          1308           1814            389            280 
cat("\n* Comparing to 'SmokerCurrent'.\n")

* Comparing to 'SmokerCurrent'.
table(AEDB$SmokerStatus, AEDB$SmokerCurrent, 
      useNA = "ifany", 
      dnn = c("Updated smoking status", "Current smoker"))
                      Current smoker
Updated smoking status no data available/missing   no  yes <NA>
        Current smoker                         0    0 1308    0
        Ex-smoker                              0 1814    0    0
        Never smoked                           0  389    0    0
        <NA>                                   0  161    0  119
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the alcohol status variable.


# Fix diabetes
attach(AEDB)
AEDB[,"AlcoholUse"] <- NA
AEDB$AlcoholUse[diet810 == -999] <- NA
AEDB$AlcoholUse[diet810 == 0] <- "No"
AEDB$AlcoholUse[diet810 == 1] <- "Yes"
detach(AEDB)

# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

3.2.2 Prepare baseline characteristics

We are interested in the following variables at baseline.

  • Age (years)
  • Female sex (N, %)
  • Hypertension (N, %)
  • SBP (mmHg)
  • DBP (mmHg)
  • Diabetes mellitus (N, %)
  • Total cholesterol levels (mg/dL)
  • LDL cholesterol levels (mg/dL)
  • HDL cholesterol levels (mg/dL)
  • Triglyceride levels (mg/dL)
  • Use of statins (N, %)
  • Use of antiplatelet drugs (N, %)
  • BMI (kg/m²)
  • Smoking status (N, %)
    • Never smokers
    • Ex-smokers
    • Current smokers
  • History of CAD (N, %)
  • History of PAD (N, %)
  • Clinical manifestations
    • Asymptomatic
    • Amaurosis fugax
    • TIA
    • Stroke
  • eGFR (mL/min/1.73 m²)
  • Testosterone (nmol/L)
cat("====================================================================================================\n")
====================================================================================================
cat("SELECTION THE SHIZZLE\n")
SELECTION THE SHIZZLE
### Artery levels
# AEdata$Artery_summary: 
#           value                                                                                   label
# NOT USE - 0 No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA
# USE - 1                                                                  carotid (left & right)
# USE - 2                                               femoral/iliac (left, right or both sides)
# NOT USE - 3                                               other carotid arteries (common, external)
# NOT USE - 4                                   carotid bypass and injury (left, right or both sides)
# NOT USE - 5                                                         aneurysmata (carotid & femoral)
# NOT USE - 6                                                                                   aorta
# NOT USE - 7                                            other arteries (renal, popliteal, vertebral)
# NOT USE - 8                        femoral bypass, angioseal and injury (left, right or both sides)

### AEdata$informedconsent
#           value                                                                                           label
# NOT USE - -999                                                                                         missing
# NOT USE - 0                                                                                        no, died
# USE - 1                                                                                             yes
# USE - 2                                                             yes, health treatment when possible
# USE - 3                                                                        yes, no health treatment
# USE - 4                                                yes, no health treatment, no commercial business
# NOT USE - 5                                                          yes, no tissue, no commerical business
# NOT USE - 6                      yes, no tissue, no questionnaires, no medical info, no commercial business
# USE - 7                             yes, no questionnaires, no health treatment, no commercial business
# USE - 8                                          yes, no questionnaires, health treatment when possible
# NOT USE - 9                  yes, no tissue, no questionnaires, no health treatment, no commerical business
# USE - 10                               yes, no health treatment, no medical info, no commercial business
# NOT USE - 11 yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business
# USE - 12                                                     yes, no questionnaires, no health treatment
# NOT USE - 13                                                             yes, no tissue, no health treatment
# NOT USE - 14                                                               yes, no tissue, no questionnaires
# NOT USE - 15                                                  yes, no tissue, health treatment when possible
# NOT USE - 16                                                                                  yes, no tissue
# USE - 17                                                                     yes, no commerical business
# USE - 18                                     yes, health treatment when possible, no commercial business
# USE - 19                                                    yes, no medical info, no commercial business
# USE - 20                                                                          yes, no questionnaires
# NOT USE - 21                         yes, no tissue, no questionnaires, no health treatment, no medical info
# NOT USE - 22                  yes, no tissue, no questionnaires, no health treatment, no commercial business
# USE - 23                                                                            yes, no medical info
# USE - 24                                                  yes, no questionnaires, no commercial business
# USE - 25                                    yes, no questionnaires, no health treatment, no medical info
# USE - 26                  yes, no questionnaires, health treatment when possible, no commercial business
# USE - 27                                                      yes,  no health treatment, no medical info
# NOT USE - 28                                                                             no, doesn't want to
# NOT USE - 29                                                                              no, unable to sign
# NOT USE - 30                                                                                 no, no reaction
# NOT USE - 31                                                                                        no, lost
# NOT USE - 32                                                                                     no, too old
# NOT USE - 34                                            yes, no medical info, health treatment when possible
# NOT USE - 35                                             no (never asked for IC because there was no tissue)
# USE - 36                    yes, no medical info, no commercial business, health treatment when possible
# NOT USE - 37                                                                                    no, endpoint
# USE - 38                                                         wil niets invullen, wel alles gebruiken
# USE - 39                                           second informed concents: yes, no commercial business
# NOT USE - 40                                                                              nooit geincludeerd

cat("- sanity checking PRIOR to selection")
- sanity checking PRIOR to selection
library(data.table)
require(labelled)
ae.gender <- to_factor(AEDB$Gender)
ae.hospital <- to_factor(AEDB$Hospital)
table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"))
        Hospital
Sex      St. Antonius, Nieuwegein UMC Utrecht
  female                      524         636
  male                       1211        1420
ae.artery <- to_factor(AEDB$Artery_summary)
table(ae.artery, ae.gender, dnn = c("Sex", "Artery"))
                                                                                         Artery
Sex                                                                                       female male
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA      0    0
  carotid (left & right)                                                                     805 1781
  femoral/iliac (left, right or both sides)                                                  320  796
  other carotid arteries (common, external)                                                   17   35
  carotid bypass and injury (left, right or both sides)                                        6    3
  aneurysmata (carotid & femoral)                                                              1    0
  aorta                                                                                        3    5
  other arteries (renal, popliteal, vertebral)                                                 4    9
  femoral bypass, angioseal and injury (left, right or both sides)                             4    2
rm(ae.gender, ae.hospital, ae.artery)

# I change numeric and factors manually because, well, I wouldn't know how to fix it otherwise
# to have this 'tibble' work with 'tableone'... :-)

AEDB$Age <- as.numeric(AEDB$Age)
AEDB$diastoli <- as.numeric(AEDB$diastoli)
AEDB$systolic <- as.numeric(AEDB$systolic)

AEDB$TC_finalCU <- as.numeric(AEDB$TC_finalCU)
AEDB$LDL_finalCU <- as.numeric(AEDB$LDL_finalCU)
AEDB$HDL_finalCU <- as.numeric(AEDB$HDL_finalCU)
AEDB$TG_finalCU <- as.numeric(AEDB$TG_finalCU)

AEDB$TC_final <- as.numeric(AEDB$TC_final)
AEDB$LDL_final <- as.numeric(AEDB$LDL_final)
AEDB$HDL_final <- as.numeric(AEDB$HDL_final)
AEDB$TG_final <- as.numeric(AEDB$TG_final)

AEDB$Age <- as.numeric(AEDB$Age)
AEDB$GFR_MDRD <- as.numeric(AEDB$GFR_MDRD)
AEDB$BMI <- as.numeric(AEDB$BMI)
AEDB$eCigarettes <- as.numeric(AEDB$eCigarettes)
AEDB$ePackYearsSmoking <- as.numeric(AEDB$ePackYearsSmoking)
AEDB$EP_composite_time <- as.numeric(AEDB$EP_composite_time)

AEDB$macmean0 <- as.numeric(AEDB$macmean0)
AEDB$smcmean0 <- as.numeric(AEDB$smcmean0)
AEDB$neutrophils <- as.numeric(AEDB$neutrophils)
AEDB$Mast_cells_plaque <- as.numeric(AEDB$Mast_cells_plaque)
AEDB$vessel_density_averaged <- as.numeric(AEDB$vessel_density_averaged)

require(labelled)
AEDB$ORyear <- to_factor(AEDB$ORyear)
AEDB$Gender <- to_factor(AEDB$Gender)
AEDB$Hospital <- to_factor(AEDB$Hospital)
AEDB$KDOQI <- to_factor(AEDB$KDOQI)
AEDB$BMI_WHO <- to_factor(AEDB$BMI_WHO)
AEDB$DiabetesStatus <- to_factor(AEDB$DiabetesStatus)
AEDB$SmokerStatus <- to_factor(AEDB$SmokerStatus)
AEDB$AlcoholUse <- to_factor(AEDB$AlcoholUse)

AEDB$Hypertension.selfreport <- to_factor(AEDB$Hypertension1)
AEDB$Hypertension.selfreportdrug <- to_factor(AEDB$Hypertension2)
AEDB$Hypertension.composite <- to_factor(AEDB$Hypertension.composite)
AEDB$Hypertension.drugs <- to_factor(AEDB$Hypertension.drugs)

AEDB$Med.anticoagulants <- to_factor(AEDB$Med.anticoagulants)
AEDB$Med.all.antiplatelet <- to_factor(AEDB$Med.all.antiplatelet)
AEDB$Med.Statin.LLD <- to_factor(AEDB$Med.Statin.LLD)

AEDB$Stroke_Dx <- to_factor(AEDB$Stroke_Dx)
AEDB$CAD_history <- to_factor(AEDB$CAD_history)
AEDB$PAOD <- to_factor(AEDB$PAOD)
AEDB$Peripheral.interv <- to_factor(AEDB$Peripheral.interv)

AEDB$sympt <- to_factor(AEDB$sympt)
AEDB$Symptoms.3g <- to_factor(AEDB$Symptoms.3g)
AEDB$Symptoms.4g <- to_factor(AEDB$Symptoms.4g)
AEDB$Symptoms.5G <- to_factor(AEDB$Symptoms.5G)
AEDB$AsymptSympt <- to_factor(AEDB$AsymptSympt)
AEDB$AsymptSympt2G <- to_factor(AEDB$AsymptSympt2G)

AEDB$restenos <- to_factor(AEDB$restenos)
AEDB$stenose <- to_factor(AEDB$stenose)
AEDB$EP_composite <- to_factor(AEDB$EP_composite)
AEDB$Macrophages.bin <- to_factor(AEDB$Macrophages.bin)
AEDB$SMC.bin <- to_factor(AEDB$SMC.bin)
AEDB$IPH.bin <- to_factor(AEDB$IPH.bin)
AEDB$Calc.bin <- to_factor(AEDB$Calc.bin)
AEDB$Collagen.bin <- to_factor(AEDB$Collagen.bin)
AEDB$Fat.bin_10 <- to_factor(AEDB$Fat.bin_10)
AEDB$Fat.bin_40 <- to_factor(AEDB$Fat.bin_40)
AEDB$OverallPlaquePhenotype <- to_factor(AEDB$OverallPlaquePhenotype)

AEDB$Artery_summary <- to_factor(AEDB$Artery_summary)

AEDB$informedconsent <- to_factor(AEDB$informedconsent)

AEDB.CEA <- subset(AEDB,
                    (Artery_summary == "carotid (left & right)" | Artery_summary == "other carotid arteries (common, external)") & # we only want carotids
                       informedconsent != "missing" & # we are really strict in selecting based on 'informed consent'!
                       informedconsent != "no, died" &
                       informedconsent != "yes, no tissue, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                       informedconsent != "yes, no tissue, no health treatment" &
                       informedconsent != "yes, no tissue, no questionnaires" &
                       informedconsent != "yes, no tissue, health treatment when possible" &
                       informedconsent != "yes, no tissue" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                       informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                       informedconsent != "no, doesn't want to" &
                       informedconsent != "no, unable to sign" &
                       informedconsent != "no, no reaction" &
                       informedconsent != "no, lost" &
                       informedconsent != "no, too old" &
                       informedconsent != "yes, no medical info, health treatment when possible" &
                       informedconsent != "no (never asked for IC because there was no tissue)" &
                       informedconsent != "no, endpoint" &
                       informedconsent != "nooit geincludeerd" & 
                     !is.na(AsymptSympt2G))
# AEDB.CEA[1:10, 1:10]
dim(AEDB.CEA)
[1] 2421 1100
cat("===========================================================================================\n")
===========================================================================================
cat("CREATE BASELINE TABLE\n")
CREATE BASELINE TABLE
# Baseline table variables
basetable_vars = c("Hospital", "ORyear",
                   "Age", "Gender", 
                   "TC_finalCU", "LDL_finalCU", "HDL_finalCU", "TG_finalCU", 
                   "TC_final", "LDL_final", "HDL_final", "TG_final", 
                   "systolic", "diastoli", "GFR_MDRD", "BMI", 
                   "KDOQI", "BMI_WHO", 
                   "SmokerStatus", "AlcoholUse",
                   "DiabetesStatus", 
                   "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                   "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                   "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                   "restenos", "stenose",
                   "CAD_history", "PAOD", "Peripheral.interv", 
                   "EP_composite", "EP_composite_time",
                   "macmean0", "smcmean0", "Macrophages.bin", "SMC.bin",
                   "neutrophils", "Mast_cells_plaque",
                   "IPH.bin", "vessel_density_averaged",
                   "Calc.bin", "Collagen.bin", 
                   "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype")

basetable_bin = c("Gender", 
                  "KDOQI", "BMI_WHO", 
                  "SmokerStatus", "AlcoholUse",
                  "DiabetesStatus", 
                  "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                  "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                  "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", "AsymptSympt2G",
                  "restenos", "stenose",
                  "CAD_history", "PAOD", "Peripheral.interv", 
                  "EP_composite", "Macrophages.bin", "SMC.bin",
                  "IPH.bin", 
                  "Calc.bin", "Collagen.bin", 
                  "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype")
# basetable_bin

basetable_con = basetable_vars[!basetable_vars %in% basetable_bin]
# basetable_con

3.2.3 Athero-Express Biobank Study: baseline characteristics

Showing the baseline table of the whole Athero-Express Biobank.

# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
AEDB.CEA.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         # strata = "Gender",
                                         data = AEDB.CEA, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:3]
                                      
                                       level                                                                     Overall          
  n                                                                                                                 2421          
  Hospital % (freq)                    St. Antonius, Nieuwegein                                                     39.2 ( 948)   
                                       UMC Utrecht                                                                  60.8 (1473)   
  ORyear % (freq)                      No data available/missing                                                     0.0 (   0)   
                                       2002                                                                          3.3 (  81)   
                                       2003                                                                          6.5 ( 157)   
                                       2004                                                                          7.8 ( 190)   
                                       2005                                                                          7.6 ( 185)   
                                       2006                                                                          7.6 ( 183)   
                                       2007                                                                          6.3 ( 152)   
                                       2008                                                                          5.7 ( 138)   
                                       2009                                                                          7.5 ( 181)   
                                       2010                                                                          6.6 ( 159)   
                                       2011                                                                          6.7 ( 163)   
                                       2012                                                                          7.3 ( 176)   
                                       2013                                                                          6.2 ( 149)   
                                       2014                                                                          6.7 ( 163)   
                                       2015                                                                          3.1 (  76)   
                                       2016                                                                          3.5 (  85)   
                                       2017                                                                          2.7 (  65)   
                                       2018                                                                          2.7 (  66)   
                                       2019                                                                          2.1 (  52)   
  Age (mean (SD))                                                                                                 69.105 (9.302)  
  Gender % (freq)                      female                                                                       30.5 ( 738)   
                                       male                                                                         69.5 (1683)   
  TC_finalCU (mean (SD))                                                                                         184.803 (56.262) 
  LDL_finalCU (mean (SD))                                                                                        108.420 (41.744) 
  HDL_finalCU (mean (SD))                                                                                         46.435 (17.005) 
  TG_finalCU (mean (SD))                                                                                         151.216 (91.277) 
  TC_final (mean (SD))                                                                                             4.786 (1.457)  
  LDL_final (mean (SD))                                                                                            2.808 (1.081)  
  HDL_final (mean (SD))                                                                                            1.203 (0.440)  
  TG_final (mean (SD))                                                                                             1.709 (1.031)  
  systolic (mean (SD))                                                                                           152.419 (25.166) 
  diastoli (mean (SD))                                                                                            81.318 (25.188) 
  GFR_MDRD (mean (SD))                                                                                            73.121 (21.152) 
  BMI (mean (SD))                                                                                                 26.488 (3.977)  
  KDOQI % (freq)                       No data available/missing                                                     0.0 (   0)   
                                       Normal kidney function                                                       19.1 ( 462)   
                                       CKD 2 (Mild)                                                                 50.9 (1232)   
                                       CKD 3 (Moderate)                                                             22.8 ( 553)   
                                       CKD 4 (Severe)                                                                1.3 (  32)   
                                       CKD 5 (Failure)                                                               0.4 (  10)   
                                       <NA>                                                                          5.5 ( 132)   
  BMI_WHO % (freq)                     No data available/missing                                                     0.0 (   0)   
                                       Underweight                                                                   1.0 (  24)   
                                       Normal                                                                       35.1 ( 850)   
                                       Overweight                                                                   43.4 (1051)   
                                       Obese                                                                        14.5 ( 352)   
                                       <NA>                                                                          5.9 ( 144)   
  SmokerStatus % (freq)                Current smoker                                                               33.2 ( 803)   
                                       Ex-smoker                                                                    48.0 (1163)   
                                       Never smoked                                                                 12.9 ( 313)   
                                       <NA>                                                                          5.9 ( 142)   
  AlcoholUse % (freq)                  No                                                                           34.5 ( 835)   
                                       Yes                                                                          61.5 (1488)   
                                       <NA>                                                                          4.0 (  98)   
  DiabetesStatus % (freq)              Control (no Diabetes Dx/Med)                                                 75.2 (1820)   
                                       Diabetes                                                                     23.7 ( 574)   
                                       <NA>                                                                          1.1 (  27)   
  Hypertension.selfreport % (freq)     No data available/missing                                                     0.0 (   0)   
                                       no                                                                           24.3 ( 589)   
                                       yes                                                                          72.4 (1754)   
                                       <NA>                                                                          3.2 (  78)   
  Hypertension.selfreportdrug % (freq) No data available/missing                                                     0.0 (   0)   
                                       no                                                                           29.9 ( 725)   
                                       yes                                                                          65.6 (1589)   
                                       <NA>                                                                          4.4 ( 107)   
  Hypertension.composite % (freq)      No data available/missing                                                     0.0 (   0)   
                                       no                                                                           14.6 ( 353)   
                                       yes                                                                          84.3 (2040)   
                                       <NA>                                                                          1.2 (  28)   
  Hypertension.drugs % (freq)          No data available/missing                                                     0.0 (   0)   
                                       no                                                                           23.3 ( 565)   
                                       yes                                                                          75.3 (1823)   
                                       <NA>                                                                          1.4 (  33)   
  Med.anticoagulants % (freq)          No data available/missing                                                     0.0 (   0)   
                                       no                                                                           87.3 (2114)   
                                       yes                                                                          11.1 ( 269)   
                                       <NA>                                                                          1.6 (  38)   
  Med.all.antiplatelet % (freq)        No data available/missing                                                     0.0 (   0)   
                                       no                                                                           12.2 ( 295)   
                                       yes                                                                          86.3 (2090)   
                                       <NA>                                                                          1.5 (  36)   
  Med.Statin.LLD % (freq)              No data available/missing                                                     0.0 (   0)   
                                       no                                                                           20.3 ( 491)   
                                       yes                                                                          78.3 (1896)   
                                       <NA>                                                                          1.4 (  34)   
  Stroke_Dx % (freq)                   Missing                                                                       0.0 (   0)   
                                       No stroke diagnosed                                                          71.5 (1731)   
                                       Stroke diagnosed                                                             21.6 ( 524)   
                                       <NA>                                                                          6.9 ( 166)   
  sympt % (freq)                       missing                                                                       0.0 (   0)   
                                       Asymptomatic                                                                 11.2 ( 270)   
                                       TIA                                                                          39.7 ( 961)   
                                       minor stroke                                                                 16.8 ( 407)   
                                       Major stroke                                                                  9.8 ( 238)   
                                       Amaurosis fugax                                                              15.7 ( 379)   
                                       Four vessel disease                                                           1.6 (  38)   
                                       Vertebrobasilary TIA                                                          0.2 (   5)   
                                       Retinal infarction                                                            1.4 (  34)   
                                       Symptomatic, but aspecific symtoms                                            2.2 (  53)   
                                       Contralateral symptomatic occlusion                                           0.5 (  11)   
                                       retinal infarction                                                            0.2 (   6)   
                                       armclaudication due to occlusion subclavian artery, CEA needed for bypass     0.0 (   1)   
                                       retinal infarction + TIAs                                                     0.0 (   0)   
                                       Ocular ischemic syndrome                                                      0.7 (  16)   
                                       ischemisch glaucoom                                                           0.0 (   0)   
                                       subclavian steal syndrome                                                     0.1 (   2)   
                                       TGA                                                                           0.0 (   0)   
  Symptoms.5G % (freq)                 Asymptomatic                                                                 11.2 ( 270)   
                                       Ocular                                                                       16.3 ( 395)   
                                       Other                                                                         4.3 ( 105)   
                                       Retinal infarction                                                            1.7 (  40)   
                                       Stroke                                                                       26.6 ( 645)   
                                       TIA                                                                          39.9 ( 966)   
  AsymptSympt % (freq)                 Asymptomatic                                                                 11.2 ( 270)   
                                       Ocular and others                                                            22.3 ( 540)   
                                       Symptomatic                                                                  66.5 (1611)   
  AsymptSympt2G % (freq)               Asymptomatic                                                                 11.2 ( 270)   
                                       Symptomatic                                                                  88.8 (2151)   
  restenos % (freq)                    missing                                                                       0.0 (   0)   
                                       de novo                                                                      93.7 (2268)   
                                       restenosis                                                                    4.9 ( 118)   
                                       stenose bij angioseal na PTCA                                                 0.0 (   0)   
                                       <NA>                                                                          1.4 (  35)   
  stenose % (freq)                     missing                                                                       0.0 (   0)   
                                       0-49%                                                                         0.5 (  13)   
                                       50-70%                                                                        7.8 ( 189)   
                                       70-90%                                                                       46.6 (1127)   
                                       90-99%                                                                       38.3 ( 927)   
                                       100% (Occlusion)                                                              1.3 (  31)   
                                       NA                                                                            0.0 (   1)   
                                       50-99%                                                                        0.6 (  15)   
                                       70-99%                                                                        2.8 (  68)   
                                       99                                                                            0.1 (   2)   
                                       <NA>                                                                          2.0 (  48)   
  CAD_history % (freq)                 Missing                                                                       0.0 (   0)   
                                       No history CAD                                                               66.8 (1618)   
                                       History CAD                                                                  31.2 ( 756)   
                                       <NA>                                                                          1.9 (  47)   
  PAOD % (freq)                        missing/no data                                                               0.0 (   0)   
                                       no                                                                           77.5 (1876)   
                                       yes                                                                          20.5 ( 497)   
                                       <NA>                                                                          2.0 (  48)   
  Peripheral.interv % (freq)           no                                                                           77.2 (1868)   
                                       yes                                                                          19.9 ( 482)   
                                       <NA>                                                                          2.9 (  71)   
  EP_composite % (freq)                No data available.                                                            0.0 (   0)   
                                       No composite endpoints                                                       70.6 (1709)   
                                       Composite endpoints                                                          24.4 ( 590)   
                                       <NA>                                                                          5.0 ( 122)   
  EP_composite_time (mean (SD))                                                                                    2.479 (1.109)  
  macmean0 (mean (SD))                                                                                             0.768 (1.184)  
  smcmean0 (mean (SD))                                                                                             1.985 (2.381)  
  Macrophages.bin % (freq)             no/minor                                                                     34.9 ( 846)   
                                       moderate/heavy                                                               40.9 ( 991)   
                                       <NA>                                                                         24.1 ( 584)   
  SMC.bin % (freq)                     no/minor                                                                     24.9 ( 602)   
                                       moderate/heavy                                                               51.3 (1242)   
                                       <NA>                                                                         23.8 ( 577)   
  neutrophils (mean (SD))                                                                                        147.151 (419.998)
  Mast_cells_plaque (mean (SD))                                                                                  164.488 (163.771)
  IPH.bin % (freq)                     no                                                                           30.7 ( 744)   
                                       yes                                                                          45.8 (1108)   
                                       <NA>                                                                         23.5 ( 569)   
  vessel_density_averaged (mean (SD))                                                                              8.318 (6.388)  
  Calc.bin % (freq)                    no/minor                                                                     41.6 (1006)   
                                       moderate/heavy                                                               35.1 ( 849)   
                                       <NA>                                                                         23.4 ( 566)   
  Collagen.bin % (freq)                no/minor                                                                     15.8 ( 382)   
                                       moderate/heavy                                                               60.6 (1467)   
                                       <NA>                                                                         23.6 ( 572)   
  Fat.bin_10 % (freq)                   <10%                                                                        22.4 ( 542)   
                                        >10%                                                                        54.3 (1314)   
                                       <NA>                                                                         23.3 ( 565)   
  Fat.bin_40 % (freq)                  <40%                                                                         56.2 (1360)   
                                       >40%                                                                         20.5 ( 496)   
                                       <NA>                                                                         23.3 ( 565)   
  OverallPlaquePhenotype % (freq)      atheromatous                                                                 19.8 ( 480)   
                                       fibroatheromatous                                                            27.8 ( 672)   
                                       fibrous                                                                      28.7 ( 695)   
                                       <NA>                                                                         23.7 ( 574)   
                                      
                                       Missing
  n                                           
  Hospital % (freq)                     0.0   
                                              
  ORyear % (freq)                       0.0   
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
  Age (mean (SD))                       0.0   
  Gender % (freq)                       0.0   
                                              
  TC_finalCU (mean (SD))               38.0   
  LDL_finalCU (mean (SD))              45.6   
  HDL_finalCU (mean (SD))              41.7   
  TG_finalCU (mean (SD))               42.8   
  TC_final (mean (SD))                 38.0   
  LDL_final (mean (SD))                45.6   
  HDL_final (mean (SD))                41.7   
  TG_final (mean (SD))                 42.8   
  systolic (mean (SD))                 11.3   
  diastoli (mean (SD))                 11.3   
  GFR_MDRD (mean (SD))                  5.4   
  BMI (mean (SD))                       5.9   
  KDOQI % (freq)                        5.5   
                                              
                                              
                                              
                                              
                                              
                                              
  BMI_WHO % (freq)                      5.9   
                                              
                                              
                                              
                                              
                                              
  SmokerStatus % (freq)                 5.9   
                                              
                                              
                                              
  AlcoholUse % (freq)                   4.0   
                                              
                                              
  DiabetesStatus % (freq)               1.1   
                                              
                                              
  Hypertension.selfreport % (freq)      3.2   
                                              
                                              
                                              
  Hypertension.selfreportdrug % (freq)  4.4   
                                              
                                              
                                              
  Hypertension.composite % (freq)       1.2   
                                              
                                              
                                              
  Hypertension.drugs % (freq)           1.4   
                                              
                                              
                                              
  Med.anticoagulants % (freq)           1.6   
                                              
                                              
                                              
  Med.all.antiplatelet % (freq)         1.5   
                                              
                                              
                                              
  Med.Statin.LLD % (freq)               1.4   
                                              
                                              
                                              
  Stroke_Dx % (freq)                    6.9   
                                              
                                              
                                              
  sympt % (freq)                        0.0   
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
  Symptoms.5G % (freq)                  0.0   
                                              
                                              
                                              
                                              
                                              
  AsymptSympt % (freq)                  0.0   
                                              
                                              
  AsymptSympt2G % (freq)                0.0   
                                              
  restenos % (freq)                     1.4   
                                              
                                              
                                              
                                              
  stenose % (freq)                      2.0   
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
  CAD_history % (freq)                  1.9   
                                              
                                              
                                              
  PAOD % (freq)                         2.0   
                                              
                                              
                                              
  Peripheral.interv % (freq)            2.9   
                                              
                                              
  EP_composite % (freq)                 5.0   
                                              
                                              
                                              
  EP_composite_time (mean (SD))         5.2   
  macmean0 (mean (SD))                 29.7   
  smcmean0 (mean (SD))                 29.9   
  Macrophages.bin % (freq)             24.1   
                                              
                                              
  SMC.bin % (freq)                     23.8   
                                              
                                              
  neutrophils (mean (SD))              87.4   
  Mast_cells_plaque (mean (SD))        90.0   
  IPH.bin % (freq)                     23.5   
                                              
                                              
  vessel_density_averaged (mean (SD))  35.1   
  Calc.bin % (freq)                    23.4   
                                              
                                              
  Collagen.bin % (freq)                23.6   
                                              
                                              
  Fat.bin_10 % (freq)                  23.3   
                                              
                                              
  Fat.bin_40 % (freq)                  23.3   
                                              
                                              
  OverallPlaquePhenotype % (freq)      23.7   
                                              
                                              
                                              

3.3 AESCRNA: baseline characteristics

metadata <- scRNAseqData@meta.data %>% as_tibble() %>% separate(orig.ident, c("Patient", NA))
scRNAseqDataMeta <- metadata %>% distinct(Patient, .keep_all = TRUE)
distinct: removed 6,153 rows (99%), 38 rows remaining
scRNAseqDataMetaAE <- merge(scRNAseqDataMeta, AEDB, by.x = "Patient", by.y = "STUDY_NUMBER", sort = FALSE, all.x = TRUE)
dim(scRNAseqDataMetaAE)
[1]   38 1112
# Replace missing data 
# Ref: https://cran.r-project.org/web/packages/naniar/vignettes/replace-with-na.html
require(naniar)

na_strings <- c("NA", "N A", "N / A", "N/A", "N/ A", 
                "Not Available", "Not available", 
                "missing", 
                "-999", "-99", 
                "No data available/missing", "No data available/Missing")
# Then you write ~.x %in% na_strings - which reads as “does this value occur in the list of NA strings”.

scRNAseqDataMetaAE %>%
  replace_with_na_all(condition = ~.x %in% na_strings)

cat("====================================================================================================")
====================================================================================================
cat("SELECTION THE SHIZZLE")
SELECTION THE SHIZZLE
cat("- sanity checking PRIOR to selection")
- sanity checking PRIOR to selection
library(data.table)
require(labelled)
ae.gender <- to_factor(scRNAseqDataMetaAE$Gender)
ae.hospital <- to_factor(scRNAseqDataMetaAE$Hospital)
table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"), useNA = "ifany")
        Hospital
Sex      St. Antonius, Nieuwegein UMC Utrecht <NA>
  female                        0          10    0
  male                          0          26    0
  <NA>                          0           0    2
ae.artery <- to_factor(scRNAseqDataMetaAE$Artery_summary)
table(ae.artery, ae.gender, dnn = c("Sex", "Artery"), useNA = "ifany")
                                                                                         Artery
Sex                                                                                       female male <NA>
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA      0    0    0
  carotid (left & right)                                                                      10   25    0
  femoral/iliac (left, right or both sides)                                                    0    0    0
  other carotid arteries (common, external)                                                    0    1    0
  carotid bypass and injury (left, right or both sides)                                        0    0    0
  aneurysmata (carotid & femoral)                                                              0    0    0
  aorta                                                                                        0    0    0
  other arteries (renal, popliteal, vertebral)                                                 0    0    0
  femoral bypass, angioseal and injury (left, right or both sides)                             0    0    0
  <NA>                                                                                         0    0    2
ae.ic <- to_factor(scRNAseqDataMetaAE$informedconsent)
table(ae.ic, ae.gender, useNA = "ifany")
                                                                                                 ae.gender
ae.ic                                                                                             female male <NA>
  missing                                                                                              0    0    0
  no, died                                                                                             0    0    0
  yes                                                                                                  5   14    0
  yes, health treatment when possible                                                                  2    7    0
  yes, no health treatment                                                                             1    2    0
  yes, no health treatment, no commercial business                                                     1    2    0
  yes, no tissue, no commerical business                                                               0    0    0
  yes, no tissue, no questionnaires, no medical info, no commercial business                           0    0    0
  yes, no questionnaires, no health treatment, no commercial business                                  0    0    0
  yes, no questionnaires, health treatment when possible                                               0    0    0
  yes, no tissue, no questionnaires, no health treatment, no commerical business                       0    0    0
  yes, no health treatment, no medical info, no commercial business                                    0    0    0
  yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business      0    0    0
  yes, no questionnaires, no health treatment                                                          0    0    0
  yes, no tissue, no health treatment                                                                  0    0    0
  yes, no tissue, no questionnaires                                                                    0    0    0
  yes, no tissue, health treatment when possible                                                       0    0    0
  yes, no tissue                                                                                       0    0    0
  yes, no commerical business                                                                          0    1    0
  yes, health treatment when possible, no commercial business                                          0    0    0
  yes, no medical info, no commercial business                                                         0    0    0
  yes, no questionnaires                                                                               0    0    0
  yes, no tissue, no questionnaires, no health treatment, no medical info                              0    0    0
  yes, no tissue, no questionnaires, no health treatment, no commercial business                       0    0    0
  yes, no medical info                                                                                 0    0    0
  yes, no questionnaires, no commercial business                                                       0    0    0
  yes, no questionnaires, no health treatment, no medical info                                         0    0    0
  yes, no questionnaires, health treatment when possible, no commercial business                       0    0    0
  yes,  no health treatment, no medical info                                                           0    0    0
  no, doesn't want to                                                                                  0    0    0
  no, unable to sign                                                                                   0    0    0
  no, no reaction                                                                                      0    0    0
  no, lost                                                                                             0    0    0
  no, too old                                                                                          0    0    0
  yes, no medical info, health treatment when possible                                                 1    0    0
  no (never asked for IC because there was no tissue)                                                  0    0    0
  yes, no medical info, no commercial business, health treatment when possible                         0    0    0
  no, endpoint                                                                                         0    0    0
  wil niets invullen, wel alles gebruiken                                                              0    0    0
  second informed concents: yes, no commercial business                                                0    0    0
  nooit geincludeerd                                                                                   0    0    0
  <NA>                                                                                                 0    0    2
rm(ae.gender, ae.hospital, ae.artery, ae.ic)


scRNAseqDataMetaAE.all <- subset(scRNAseqDataMetaAE,
                            (Artery_summary == "carotid (left & right)" | Artery_summary == "other carotid arteries (common, external)" ) & # we only want carotids
                              informedconsent != "missing" & # we are really strict in selecting based on 'informed consent'!
                              informedconsent != "no, died" &
                              informedconsent != "yes, no tissue, no commerical business" &
                              informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                              informedconsent != "yes, no tissue, no health treatment" &
                              informedconsent != "yes, no tissue, no questionnaires" &
                              informedconsent != "yes, no tissue, health treatment when possible" &
                              informedconsent != "yes, no tissue" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                              informedconsent != "no, doesn't want to" &
                              informedconsent != "no, unable to sign" &
                              informedconsent != "no, no reaction" &
                              informedconsent != "no, lost" &
                              informedconsent != "no, too old" &
                              informedconsent != "yes, no medical info, health treatment when possible" & 
                              informedconsent != "no (never asked for IC because there was no tissue)" &
                              informedconsent != "no, endpoint" &
                              informedconsent != "nooit geincludeerd")
# scRNAseqDataMetaAE.all[1:10, 1:10]
dim(scRNAseqDataMetaAE.all)
[1]   35 1112
# DT::datatable(scRNAseqDataMetaAE.all)

Showing the baseline table.

cat("===========================================================================================")
===========================================================================================
cat("CREATE BASELINE TABLE")
CREATE BASELINE TABLE
# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
scRNAseqDataMetaAE.all.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                                  # factorVars = basetable_bin,
                                                  # strata = "Gender",
                                                  data = scRNAseqDataMetaAE.all, includeNA = TRUE), 
                                   nonnormal = c(), 
                                   quote = FALSE, showAllLevels = TRUE,
                                   format = "p", 
                                   contDigits = 3)[,1:2]
Warning in ModuleReturnVarsExist(vars, data) :
  These variables only have NA/NaN: macmean0 smcmean0 Macrophages.bin SMC.bin neutrophils Mast_cells_plaque IPH.bin vessel_density_averaged Calc.bin Collagen.bin Fat.bin_10 Fat.bin_40 OverallPlaquePhenotype  Dropped
                                 
                                  level                                                                     Overall          
  n                                                                                                              35          
  Hospital (%)                    St. Antonius, Nieuwegein                                                      0.0          
                                  UMC Utrecht                                                                 100.0          
  ORyear (%)                      No data available/missing                                                     0.0          
                                  2002                                                                          0.0          
                                  2003                                                                          0.0          
                                  2004                                                                          0.0          
                                  2005                                                                          0.0          
                                  2006                                                                          0.0          
                                  2007                                                                          0.0          
                                  2008                                                                          0.0          
                                  2009                                                                          0.0          
                                  2010                                                                          0.0          
                                  2011                                                                          0.0          
                                  2012                                                                          0.0          
                                  2013                                                                          0.0          
                                  2014                                                                          0.0          
                                  2015                                                                          0.0          
                                  2016                                                                          0.0          
                                  2017                                                                          0.0          
                                  2018                                                                         65.7          
                                  2019                                                                         34.3          
  Age (mean (SD))                                                                                            72.743 (8.176)  
  Gender (%)                      female                                                                       25.7          
                                  male                                                                         74.3          
  TC_finalCU (mean (SD))                                                                                    168.311 (47.773) 
  LDL_finalCU (mean (SD))                                                                                    96.971 (38.196) 
  HDL_finalCU (mean (SD))                                                                                    43.897 (10.171) 
  TG_finalCU (mean (SD))                                                                                    171.469 (109.939)
  TC_final (mean (SD))                                                                                        4.359 (1.237)  
  LDL_final (mean (SD))                                                                                       2.512 (0.989)  
  HDL_final (mean (SD))                                                                                       1.137 (0.263)  
  TG_final (mean (SD))                                                                                        1.938 (1.242)  
  systolic (mean (SD))                                                                                      153.265 (25.803) 
  diastoli (mean (SD))                                                                                       80.824 (16.129) 
  GFR_MDRD (mean (SD))                                                                                       83.278 (31.136) 
  BMI (mean (SD))                                                                                            26.477 (3.428)  
  KDOQI (%)                       No data available/missing                                                     0.0          
                                  Normal kidney function                                                       34.3          
                                  CKD 2 (Mild)                                                                 31.4          
                                  CKD 3 (Moderate)                                                             22.9          
                                  CKD 4 (Severe)                                                                0.0          
                                  CKD 5 (Failure)                                                               0.0          
                                  <NA>                                                                         11.4          
  BMI_WHO (%)                     No data available/missing                                                     0.0          
                                  Underweight                                                                   2.9          
                                  Normal                                                                       31.4          
                                  Overweight                                                                   42.9          
                                  Obese                                                                        14.3          
                                  <NA>                                                                          8.6          
  SmokerStatus (%)                Current smoker                                                               34.3          
                                  Ex-smoker                                                                    48.6          
                                  Never smoked                                                                 14.3          
                                  <NA>                                                                          2.9          
  AlcoholUse (%)                  No                                                                           37.1          
                                  Yes                                                                          57.1          
                                  <NA>                                                                          5.7          
  DiabetesStatus (%)              Control (no Diabetes Dx/Med)                                                 62.9          
                                  Diabetes                                                                     37.1          
  Hypertension.selfreport (%)     No data available/missing                                                     0.0          
                                  no                                                                           11.4          
                                  yes                                                                          85.7          
                                  <NA>                                                                          2.9          
  Hypertension.selfreportdrug (%) No data available/missing                                                     0.0          
                                  no                                                                           11.4          
                                  yes                                                                          85.7          
                                  <NA>                                                                          2.9          
  Hypertension.composite (%)      No data available/missing                                                     0.0          
                                  no                                                                            5.7          
                                  yes                                                                          94.3          
  Hypertension.drugs (%)          No data available/missing                                                     0.0          
                                  no                                                                            5.7          
                                  yes                                                                          91.4          
                                  <NA>                                                                          2.9          
  Med.anticoagulants (%)          No data available/missing                                                     0.0          
                                  no                                                                           88.6          
                                  yes                                                                           5.7          
                                  <NA>                                                                          5.7          
  Med.all.antiplatelet (%)        No data available/missing                                                     0.0          
                                  no                                                                           25.7          
                                  yes                                                                          71.4          
                                  <NA>                                                                          2.9          
  Med.Statin.LLD (%)              No data available/missing                                                     0.0          
                                  no                                                                           20.0          
                                  yes                                                                          77.1          
                                  <NA>                                                                          2.9          
  Stroke_Dx (%)                   Missing                                                                       0.0          
                                  No stroke diagnosed                                                          51.4          
                                  Stroke diagnosed                                                             48.6          
  sympt (%)                       missing                                                                       0.0          
                                  Asymptomatic                                                                 17.1          
                                  TIA                                                                          14.3          
                                  minor stroke                                                                 34.3          
                                  Major stroke                                                                  8.6          
                                  Amaurosis fugax                                                              14.3          
                                  Four vessel disease                                                           0.0          
                                  Vertebrobasilary TIA                                                          0.0          
                                  Retinal infarction                                                            2.9          
                                  Symptomatic, but aspecific symtoms                                            0.0          
                                  Contralateral symptomatic occlusion                                           0.0          
                                  retinal infarction                                                            2.9          
                                  armclaudication due to occlusion subclavian artery, CEA needed for bypass     0.0          
                                  retinal infarction + TIAs                                                     0.0          
                                  Ocular ischemic syndrome                                                      5.7          
                                  ischemisch glaucoom                                                           0.0          
                                  subclavian steal syndrome                                                     0.0          
                                  TGA                                                                           0.0          
  Symptoms.5G (%)                 Asymptomatic                                                                 17.1          
                                  Ocular                                                                       20.0          
                                  Other                                                                         0.0          
                                  Retinal infarction                                                            5.7          
                                  Stroke                                                                       42.9          
                                  TIA                                                                          14.3          
  AsymptSympt (%)                 Asymptomatic                                                                 17.1          
                                  Ocular and others                                                            25.7          
                                  Symptomatic                                                                  57.1          
  AsymptSympt2G (%)               Asymptomatic                                                                 17.1          
                                  Symptomatic                                                                  82.9          
  restenos (%)                    missing                                                                       0.0          
                                  de novo                                                                     100.0          
                                  restenosis                                                                    0.0          
                                  stenose bij angioseal na PTCA                                                 0.0          
  stenose (%)                     missing                                                                       0.0          
                                  0-49%                                                                         2.9          
                                  50-70%                                                                       17.1          
                                  70-90%                                                                       42.9          
                                  90-99%                                                                       17.1          
                                  100% (Occlusion)                                                              0.0          
                                  NA                                                                            0.0          
                                  50-99%                                                                        0.0          
                                  70-99%                                                                       20.0          
                                  99                                                                            0.0          
  CAD_history (%)                 Missing                                                                       0.0          
                                  No history CAD                                                               74.3          
                                  History CAD                                                                  25.7          
  PAOD (%)                        missing/no data                                                               0.0          
                                  no                                                                           85.7          
                                  yes                                                                          14.3          
  Peripheral.interv (%)           no                                                                           77.1          
                                  yes                                                                          20.0          
                                  <NA>                                                                          2.9          
  EP_composite (%)                No data available.                                                            0.0          
                                  No composite endpoints                                                       42.9          
                                  Composite endpoints                                                          11.4          
                                  <NA>                                                                         45.7          
  EP_composite_time (mean (SD))                                                                               0.931 (0.483)  

Writing the baseline table to Excel format.

# Write basetable
require(openxlsx)
write.xlsx(file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AE.BaselineTable.scRNAseq.xlsx"), 
           format(scRNAseqDataMetaAE.all.tableOne, digits = 5, scientific = FALSE) , rowNames = TRUE, colNames = TRUE)

4 AESCRNA

4.1 Quality control

Here review the number of cells per sample, plate, and patients. And plot the ratio’s per sample and study number.

## check stuff
cat("\nHow many cells per type ...?")

How many cells per type ...?
sort(table(scRNAseqData@meta.data$SCT_snn_res.0.8))

  17   16   15   14   13   12   11   10    9    8    7    6    5    4    3    2    1    0 
  31   34   84  110  151  172  190  203  211  225  290  345  437  534  577  626  861 1110 
# cat("\n\nHow many cells per plate ...?")
# sort(table(scRNAseqData@meta.data$ID))

# cat("\n\nHow many cells per type per plate ...?")
# table(scRNAseqData@meta.data$SCT_snn_res.0.8, scRNAseqData@meta.data$ID)

cat("\n\nHow many cells per patient ...?")


How many cells per patient ...?
sort(table(scRNAseqData@meta.data$Patient))
integer(0)
cat("\n\nVisualizing these ratio's per study number and sample ...?")


Visualizing these ratio's per study number and sample ...?
UMAPPlot(scRNAseqData, label = TRUE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)
ggsave(paste0(PLOT_loc, "/", Today, ".UMAP.png"), plot = last_plot())
Saving 7.29 x 4.51 in image
ggsave(paste0(PLOT_loc, "/", Today, ".UMAP.ps"), plot = last_plot())
Saving 7.29 x 4.51 in image

# barplot(prop.table(x = table(scRNAseqData@active.ident, scRNAseqData@meta.data$Patient)), 
#         cex.axis = 1.0, cex.names = 0.5, las = 1,
#         col = uithof_color, xlab = "study number", legend.text = FALSE, args.legend = list(x = "bottom"))
# dev.copy(pdf, paste0(QC_loc, "/", Today, ".cell_ratios_per_sample.pdf"))
# dev.off()

# barplot(prop.table(x = table(scRNAseqData@active.ident, scRNAseqData@meta.data$ID)), 
#         cex.axis = 1.0, cex.names = 0.5, las = 2,
#         col = uithof_color, xlab = "sample ID", legend.text = FALSE, args.legend = list(x = "bottom"))
# dev.copy(pdf, paste0(QC_loc, "/", Today, ".cell_ratios_per_sample_per_plate.pdf"))
# dev.off()

4.2 Visualisations

Let’s project known cellular markers.


UMAPPlot(scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)


# endothelial cells
FeaturePlot(scRNAseqData, features = c("CD34"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("EDN1"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("EDNRA", "EDNRB"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CDH5", "PECAM1"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("ACKR1"), cols =  c("#ECECEC", "#DB003F"))


# SMC
FeaturePlot(scRNAseqData, features = c("MYH11"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("LGALS3", "ACTA2"), cols =  c("#ECECEC", "#DB003F"))


# macrophages
FeaturePlot(scRNAseqData, features = c("CD14", "CD68"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CD36"), cols =  c("#ECECEC", "#DB003F"))


# t-cells
FeaturePlot(scRNAseqData, features = c("CD3E"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CD4"), cols =  c("#ECECEC", "#DB003F"))

# FeaturePlot(scRNAseqData, features = c("CD8"), cols =  c("#ECECEC", "#DB003F"))

# b-cells
FeaturePlot(scRNAseqData, features = c("CD79A"), cols =  c("#ECECEC", "#DB003F"))


# mast cells
FeaturePlot(scRNAseqData, features = c("KIT"), cols =  c("#ECECEC", "#DB003F"))


# NK cells
FeaturePlot(scRNAseqData, features = c("NCAM1"), cols =  c("#ECECEC", "#DB003F"))

4.3 Targets of interest:

We check whether the targets genes, C6orf195, EDN1, PHACTR1, TBC1D7, GFOD1, ENPP1, ENPP3, IGFBP3, AC011294.3, MTAP, RP11-145E5.5, C9orf53, CDKN2A, CDKN2B, ZNF485, ZNF32, AL137026.1, ARID5B, RTKN2, CAMK2G, VCL, AP3M1, ADK, KAT6B, DUPD1, DUSP13, SAMD8, VDAC2, COMTD1, FGF23, COL4A1, COL4A2, CHRNA5, CHRNB4, ADAMTS7, MORF4L1, CTSH, BCAM, PVRL2, TOMM40, APOE, APOC1, were sequenced using our method (STARseq).

Several genes are not present or have different names, these are listed here, and were manually removed from/changed in the list.

  • AC011294.3 ==> not found
  • C6orf195 => LINC01600 replacement, not found
  • C9orf53 => CDKN2A-DT replacement, not found
  • AL137026.1 ==> not found
  • DUPD1 => DUSP29 replacement, not found
  • RP11-145E5.5 ==> not found
  • PVRL2 => NECTIN2 replacement
  • KIAA1462 => JCAD replacement
  • ZNF32 ==> not found
  • BCAM ==> not found
target_genes
 [1] "C6orf195"     "EDN1"         "PHACTR1"      "TBC1D7"       "GFOD1"        "ENPP1"        "ENPP3"        "IGFBP3"      
 [9] "AC011294.3"   "MTAP"         "RP11-145E5.5" "C9orf53"      "CDKN2A"       "CDKN2B"       "ZNF485"       "ZNF32"       
[17] "AL137026.1"   "ARID5B"       "RTKN2"        "CAMK2G"       "VCL"          "AP3M1"        "ADK"          "KAT6B"       
[25] "DUPD1"        "DUSP13"       "SAMD8"        "VDAC2"        "COMTD1"       "FGF23"        "COL4A1"       "COL4A2"      
[33] "CHRNA5"       "CHRNB4"       "ADAMTS7"      "MORF4L1"      "CTSH"         "BCAM"         "PVRL2"        "TOMM40"      
[41] "APOE"         "APOC1"       

4.3.1 Expression in cell communities


target_genes_rm <- c("AC011294.3", "C6orf195", "C9orf53", "AL137026.1", "DUPD1", "RP11-145E5.5", "PVRL2",
                     "RP1-257A7.4", "RP1-257A7.5", "KIAA1462",
                     "ZNF32", "BCAM")

temp = target_genes[!target_genes %in% target_genes_rm]

target_genes_qc <- c(temp, "NECTIN2", "JCAD")

target_genes_qc
 [1] "EDN1"    "PHACTR1" "TBC1D7"  "GFOD1"   "ENPP1"   "ENPP3"   "IGFBP3"  "MTAP"    "CDKN2A"  "CDKN2B"  "ZNF485"  "ARID5B"  "RTKN2"  
[14] "CAMK2G"  "VCL"     "AP3M1"   "ADK"     "KAT6B"   "DUSP13"  "SAMD8"   "VDAC2"   "COMTD1"  "FGF23"   "COL4A1"  "COL4A2"  "CHRNA5" 
[27] "CHRNB4"  "ADAMTS7" "MORF4L1" "CTSH"    "TOMM40"  "APOE"    "APOC1"   "NECTIN2" "JCAD"   
library(RColorBrewer)

p1 <- DotPlot(scRNAseqData, features = target_genes_qc,
        cols = "RdBu")

p1 + theme(axis.text.x = element_text(angle = 45, hjust=1, size = 5))

ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.Targets.png"), plot = last_plot())
Saving 7.29 x 4.51 in image
ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.Targets.ps"), plot = last_plot())
Saving 7.29 x 4.51 in image

rm(p1)

# FeaturePlot(scRNAseqData, features = c(target_genes_qc),
#             cols =  c("#ECECEC", "#DB003F", "#9A3480","#1290D9"),
#             combine = TRUE)
# 
# ggsave(paste0(PLOT_loc, "/", Today, ".FeaturePlot.Targets.png"), plot = last_plot())
# ggsave(paste0(PLOT_loc, "/", Today, ".FeaturePlot.Targets.ps"), plot = last_plot())
# VlnPlot(scRNAseqData, features = "DUSP29")

for (GENE in target_genes_qc){
  print(paste0("Projecting the expression of ", GENE, "."))

  vp1 <-  VlnPlot(scRNAseqData, features = GENE) + 
    xlab("cell communities") + 
    ylab(bquote("normalized expression")) +
    theme(axis.title.x = element_text(color = "#000000", size = 14, face = "bold"), 
            axis.title.y = element_text(color = "#000000", size = 14, face = "bold"), 
            legend.position = "none")
    ggsave(paste0(PLOT_loc, "/", Today, ".VlnPlot.",GENE,".png"), plot = last_plot())
    ggsave(paste0(PLOT_loc, "/", Today, ".VlnPlot.",GENE,".ps"), plot = last_plot())
  
  # print(vp1)
  
}
[1] "Projecting the expression of EDN1."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of PHACTR1."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of TBC1D7."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of GFOD1."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of ENPP1."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of ENPP3."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of IGFBP3."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of MTAP."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of CDKN2A."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of CDKN2B."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of ZNF485."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of ARID5B."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of RTKN2."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of CAMK2G."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of VCL."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of AP3M1."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of ADK."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of KAT6B."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of DUSP13."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of SAMD8."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of VDAC2."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of COMTD1."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of FGF23."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of COL4A1."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of COL4A2."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of CHRNA5."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of CHRNB4."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of ADAMTS7."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of MORF4L1."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of CTSH."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of TOMM40."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of APOE."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of APOC1."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of NECTIN2."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of JCAD."
Saving 7 x 7 in image
Saving 7 x 7 in image

4.3.2 Differential expression between cell communities

Here we project genes to only the broad cell communities:

  • macrophages
  • endothelial cells
  • smooth muscle cells
  • T-cells
  • B-cells
  • Mast cells
  • NK-cells
  • Mixed cells

4.3.2.1 Macrophages

Comparison between the macrophages cell communities (CD14/CD68+), and all other communities.

N_GENES=20552
MAC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III"), 
                          ident.2 = c(#"CD14+CD68+ M I", 
                                      #"CD14+CD68+ M II", 
                                      #"CD14+CD68+ M III",
                                      "CD3+CD8A+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+ Treg", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC", 
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

DT::datatable(MAC.markers)
MAC_Volcano_TargetsA = EnhancedVolcano(MAC.markers,
    lab = rownames(MAC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Macrophage markers\n(Macrophage communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
MAC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MAC.DEG.Targets.pdf"), 
       plot = MAC_Volcano_TargetsA)
Saving 7.29 x 4.51 in image

The target results are given below and written to a file.

library(tibble)
MAC.markers <- add_column(MAC.markers, Gene = row.names(MAC.markers), .before = 1)

temp <- MAC.markers[MAC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MAC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.2 Smooth muscle cells

Comparison between the smooth muscle cell communities (ACTA2+), and all other communities.

N_GENES=20552
SMC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("ACTA2+ SMC"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8A+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+ Treg", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      # "ACTA2+ SMC", 
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 03s      
  |++                                                | 2 % ~01m 04s      
  |++                                                | 3 % ~59s          
  |+++                                               | 4 % ~56s          
  |+++                                               | 5 % ~53s          
  |++++                                              | 6 % ~01m 09s      
  |++++                                              | 7 % ~01m 05s      
  |+++++                                             | 9 % ~01m 02s      
  |+++++                                             | 10% ~60s          
  |++++++                                            | 11% ~58s          
  |++++++                                            | 12% ~56s          
  |+++++++                                           | 13% ~54s          
  |+++++++                                           | 14% ~52s          
  |++++++++                                          | 15% ~53s          
  |++++++++                                          | 16% ~51s          
  |+++++++++                                         | 17% ~50s          
  |++++++++++                                        | 18% ~49s          
  |++++++++++                                        | 19% ~47s          
  |+++++++++++                                       | 20% ~46s          
  |+++++++++++                                       | 21% ~45s          
  |++++++++++++                                      | 22% ~44s          
  |++++++++++++                                      | 23% ~43s          
  |+++++++++++++                                     | 24% ~42s          
  |+++++++++++++                                     | 26% ~42s          
  |++++++++++++++                                    | 27% ~41s          
  |++++++++++++++                                    | 28% ~40s          
  |+++++++++++++++                                   | 29% ~40s          
  |+++++++++++++++                                   | 30% ~39s          
  |++++++++++++++++                                  | 31% ~39s          
  |++++++++++++++++                                  | 32% ~38s          
  |+++++++++++++++++                                 | 33% ~38s          
  |++++++++++++++++++                                | 34% ~37s          
  |++++++++++++++++++                                | 35% ~36s          
  |+++++++++++++++++++                               | 36% ~35s          
  |+++++++++++++++++++                               | 37% ~35s          
  |++++++++++++++++++++                              | 38% ~34s          
  |++++++++++++++++++++                              | 39% ~34s          
  |+++++++++++++++++++++                             | 40% ~34s          
  |+++++++++++++++++++++                             | 41% ~33s          
  |++++++++++++++++++++++                            | 43% ~32s          
  |++++++++++++++++++++++                            | 44% ~32s          
  |+++++++++++++++++++++++                           | 45% ~31s          
  |+++++++++++++++++++++++                           | 46% ~30s          
  |++++++++++++++++++++++++                          | 47% ~30s          
  |++++++++++++++++++++++++                          | 48% ~29s          
  |+++++++++++++++++++++++++                         | 49% ~28s          
  |+++++++++++++++++++++++++                         | 50% ~28s          
  |++++++++++++++++++++++++++                        | 51% ~27s          
  |+++++++++++++++++++++++++++                       | 52% ~26s          
  |+++++++++++++++++++++++++++                       | 53% ~26s          
  |++++++++++++++++++++++++++++                      | 54% ~25s          
  |++++++++++++++++++++++++++++                      | 55% ~24s          
  |+++++++++++++++++++++++++++++                     | 56% ~24s          
  |+++++++++++++++++++++++++++++                     | 57% ~23s          
  |++++++++++++++++++++++++++++++                    | 59% ~23s          
  |++++++++++++++++++++++++++++++                    | 60% ~22s          
  |+++++++++++++++++++++++++++++++                   | 61% ~21s          
  |+++++++++++++++++++++++++++++++                   | 62% ~21s          
  |++++++++++++++++++++++++++++++++                  | 63% ~20s          
  |++++++++++++++++++++++++++++++++                  | 64% ~20s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~19s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~19s          
  |++++++++++++++++++++++++++++++++++                | 67% ~18s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~17s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~17s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~16s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~16s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~15s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~15s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~14s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~13s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~13s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~12s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~12s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=53s  
DT::datatable(SMC.markers)
SMC_Volcano_TargetsA = EnhancedVolcano(SMC.markers,
    lab = rownames(SMC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "SMC markers\n(SMC communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
SMC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.SMC.DEG.Targets.pdf"), 
       plot = SMC_Volcano_TargetsA)
Saving 7.29 x 4.51 in image

The target results are given below and written to a file.

library(tibble)
SMC.markers <- add_column(SMC.markers, Gene = row.names(SMC.markers), .before = 1)

temp <- SMC.markers[SMC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".SMC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.3 Endothelial cells

Comparison between the endothelial cell communities (CD34+), and all other communities.

N_GENES=20552
EC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD34+ EC I", "CD34+ EC II"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8A+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+ Treg", 
                                      # "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~47s          
  |++                                                | 2 % ~46s          
  |++                                                | 3 % ~45s          
  |+++                                               | 4 % ~44s          
  |+++                                               | 5 % ~43s          
  |++++                                              | 6 % ~42s          
  |++++                                              | 8 % ~41s          
  |+++++                                             | 9 % ~40s          
  |+++++                                             | 10% ~40s          
  |++++++                                            | 11% ~40s          
  |++++++                                            | 12% ~39s          
  |+++++++                                           | 13% ~41s          
  |+++++++                                           | 14% ~40s          
  |++++++++                                          | 15% ~39s          
  |+++++++++                                         | 16% ~39s          
  |+++++++++                                         | 17% ~38s          
  |++++++++++                                        | 18% ~37s          
  |++++++++++                                        | 19% ~37s          
  |+++++++++++                                       | 20% ~36s          
  |+++++++++++                                       | 22% ~36s          
  |++++++++++++                                      | 23% ~35s          
  |++++++++++++                                      | 24% ~34s          
  |+++++++++++++                                     | 25% ~34s          
  |+++++++++++++                                     | 26% ~33s          
  |++++++++++++++                                    | 27% ~33s          
  |++++++++++++++                                    | 28% ~33s          
  |+++++++++++++++                                   | 29% ~32s          
  |++++++++++++++++                                  | 30% ~31s          
  |++++++++++++++++                                  | 31% ~31s          
  |+++++++++++++++++                                 | 32% ~31s          
  |+++++++++++++++++                                 | 33% ~30s          
  |++++++++++++++++++                                | 34% ~30s          
  |++++++++++++++++++                                | 35% ~29s          
  |+++++++++++++++++++                               | 37% ~29s          
  |+++++++++++++++++++                               | 38% ~29s          
  |++++++++++++++++++++                              | 39% ~28s          
  |++++++++++++++++++++                              | 40% ~28s          
  |+++++++++++++++++++++                             | 41% ~27s          
  |+++++++++++++++++++++                             | 42% ~27s          
  |++++++++++++++++++++++                            | 43% ~26s          
  |+++++++++++++++++++++++                           | 44% ~26s          
  |+++++++++++++++++++++++                           | 45% ~25s          
  |++++++++++++++++++++++++                          | 46% ~24s          
  |++++++++++++++++++++++++                          | 47% ~24s          
  |+++++++++++++++++++++++++                         | 48% ~23s          
  |+++++++++++++++++++++++++                         | 49% ~23s          
  |++++++++++++++++++++++++++                        | 51% ~22s          
  |++++++++++++++++++++++++++                        | 52% ~22s          
  |+++++++++++++++++++++++++++                       | 53% ~21s          
  |+++++++++++++++++++++++++++                       | 54% ~21s          
  |++++++++++++++++++++++++++++                      | 55% ~20s          
  |++++++++++++++++++++++++++++                      | 56% ~20s          
  |+++++++++++++++++++++++++++++                     | 57% ~20s          
  |++++++++++++++++++++++++++++++                    | 58% ~20s          
  |++++++++++++++++++++++++++++++                    | 59% ~19s          
  |+++++++++++++++++++++++++++++++                   | 60% ~19s          
  |+++++++++++++++++++++++++++++++                   | 61% ~18s          
  |++++++++++++++++++++++++++++++++                  | 62% ~18s          
  |++++++++++++++++++++++++++++++++                  | 63% ~17s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~17s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~16s          
  |++++++++++++++++++++++++++++++++++                | 67% ~16s          
  |++++++++++++++++++++++++++++++++++                | 68% ~16s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~15s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~15s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=49s  
DT::datatable(EC.markers)
EC_Volcano_TargetsA = EnhancedVolcano(EC.markers,
    lab = rownames(EC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Endothelial cell markers\n(EC communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
EC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.EC.DEG.Targets.pdf"), 
       plot = EC_Volcano_TargetsA)
Saving 7.29 x 4.51 in image

The target results are given below and written to a file.

library(tibble)
EC.markers <- add_column(EC.markers, Gene = row.names(EC.markers), .before = 1)

temp <- EC.markers[EC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".EC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.4 T-cells

Comparison between the T-cell communities (CD3/CD4/CD8+), and all other communities.

N_GENES=20552
TC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD3+CD8A+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+ Treg"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      # "CD3+CD8+ T I",
                                      # "CD3+CD8A+ T II ", 
                                      # "CD3+CD8 T III", 
                                      # "CD3+CD4+ T I", 
                                      # "CD3+CD4+ T II", 
                                      # "CD3+CD4+ T III", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~41s          
  |++                                                | 2 % ~37s          
  |++                                                | 3 % ~36s          
  |+++                                               | 4 % ~36s          
  |+++                                               | 5 % ~36s          
  |++++                                              | 6 % ~35s          
  |++++                                              | 7 % ~34s          
  |+++++                                             | 8 % ~34s          
  |+++++                                             | 9 % ~33s          
  |++++++                                            | 11% ~33s          
  |++++++                                            | 12% ~33s          
  |+++++++                                           | 13% ~33s          
  |+++++++                                           | 14% ~32s          
  |++++++++                                          | 15% ~32s          
  |++++++++                                          | 16% ~31s          
  |+++++++++                                         | 17% ~33s          
  |+++++++++                                         | 18% ~32s          
  |++++++++++                                        | 19% ~32s          
  |++++++++++                                        | 20% ~31s          
  |+++++++++++                                       | 21% ~31s          
  |++++++++++++                                      | 22% ~30s          
  |++++++++++++                                      | 23% ~30s          
  |+++++++++++++                                     | 24% ~29s          
  |+++++++++++++                                     | 25% ~29s          
  |++++++++++++++                                    | 26% ~28s          
  |++++++++++++++                                    | 27% ~28s          
  |+++++++++++++++                                   | 28% ~27s          
  |+++++++++++++++                                   | 29% ~27s          
  |++++++++++++++++                                  | 31% ~26s          
  |++++++++++++++++                                  | 32% ~26s          
  |+++++++++++++++++                                 | 33% ~26s          
  |+++++++++++++++++                                 | 34% ~25s          
  |++++++++++++++++++                                | 35% ~25s          
  |++++++++++++++++++                                | 36% ~25s          
  |+++++++++++++++++++                               | 37% ~24s          
  |+++++++++++++++++++                               | 38% ~24s          
  |++++++++++++++++++++                              | 39% ~23s          
  |++++++++++++++++++++                              | 40% ~23s          
  |+++++++++++++++++++++                             | 41% ~22s          
  |++++++++++++++++++++++                            | 42% ~22s          
  |++++++++++++++++++++++                            | 43% ~21s          
  |+++++++++++++++++++++++                           | 44% ~21s          
  |+++++++++++++++++++++++                           | 45% ~21s          
  |++++++++++++++++++++++++                          | 46% ~20s          
  |++++++++++++++++++++++++                          | 47% ~25s          
  |+++++++++++++++++++++++++                         | 48% ~25s          
  |+++++++++++++++++++++++++                         | 49% ~24s          
  |++++++++++++++++++++++++++                        | 51% ~24s          
  |++++++++++++++++++++++++++                        | 52% ~23s          
  |+++++++++++++++++++++++++++                       | 53% ~22s          
  |+++++++++++++++++++++++++++                       | 54% ~22s          
  |++++++++++++++++++++++++++++                      | 55% ~21s          
  |++++++++++++++++++++++++++++                      | 56% ~21s          
  |+++++++++++++++++++++++++++++                     | 57% ~20s          
  |+++++++++++++++++++++++++++++                     | 58% ~19s          
  |++++++++++++++++++++++++++++++                    | 59% ~19s          
  |++++++++++++++++++++++++++++++                    | 60% ~18s          
  |+++++++++++++++++++++++++++++++                   | 61% ~18s          
  |++++++++++++++++++++++++++++++++                  | 62% ~17s          
  |++++++++++++++++++++++++++++++++                  | 63% ~17s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~16s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~16s          
  |++++++++++++++++++++++++++++++++++                | 66% ~15s          
  |++++++++++++++++++++++++++++++++++                | 67% ~15s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~14s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~14s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~13s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~13s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~12s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~12s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~11s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~11s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~10s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~10s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~09s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=43s  
DT::datatable(TC.markers)
TC_Volcano_TargetsA = EnhancedVolcano(TC.markers,
    lab = rownames(TC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "T-cell markers\n(T-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
TC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.TC.DEG.Targets.pdf"), 
       plot = TC_Volcano_TargetsA)
Saving 7.29 x 4.51 in image

The target results are given below and written to a file.

library(tibble)
TC.markers <- add_column(TC.markers, Gene = row.names(TC.markers), .before = 1)

temp <- TC.markers[TC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".TC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.5 B-cells

Comparison between the B-cell communities (CD79A+), and all other communities.

N_GENES=20552
BC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD79A+ B I", 
                                      "CD79A+ B II"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8A+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+ Treg", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      "KIT+ MC"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~26s          
  |++                                                | 2 % ~26s          
  |++                                                | 3 % ~25s          
  |+++                                               | 4 % ~25s          
  |+++                                               | 5 % ~24s          
  |++++                                              | 6 % ~24s          
  |++++                                              | 7 % ~24s          
  |+++++                                             | 8 % ~23s          
  |+++++                                             | 9 % ~23s          
  |++++++                                            | 10% ~23s          
  |++++++                                            | 11% ~23s          
  |+++++++                                           | 12% ~24s          
  |+++++++                                           | 13% ~24s          
  |++++++++                                          | 14% ~23s          
  |++++++++                                          | 15% ~23s          
  |+++++++++                                         | 16% ~23s          
  |+++++++++                                         | 17% ~22s          
  |++++++++++                                        | 18% ~22s          
  |++++++++++                                        | 19% ~21s          
  |+++++++++++                                       | 20% ~21s          
  |+++++++++++                                       | 21% ~21s          
  |++++++++++++                                      | 22% ~20s          
  |++++++++++++                                      | 23% ~20s          
  |+++++++++++++                                     | 24% ~20s          
  |+++++++++++++                                     | 26% ~19s          
  |++++++++++++++                                    | 27% ~19s          
  |++++++++++++++                                    | 28% ~19s          
  |+++++++++++++++                                   | 29% ~19s          
  |+++++++++++++++                                   | 30% ~18s          
  |++++++++++++++++                                  | 31% ~18s          
  |++++++++++++++++                                  | 32% ~18s          
  |+++++++++++++++++                                 | 33% ~18s          
  |+++++++++++++++++                                 | 34% ~18s          
  |++++++++++++++++++                                | 35% ~17s          
  |++++++++++++++++++                                | 36% ~17s          
  |+++++++++++++++++++                               | 37% ~17s          
  |+++++++++++++++++++                               | 38% ~17s          
  |++++++++++++++++++++                              | 39% ~16s          
  |++++++++++++++++++++                              | 40% ~16s          
  |+++++++++++++++++++++                             | 41% ~16s          
  |+++++++++++++++++++++                             | 42% ~16s          
  |++++++++++++++++++++++                            | 43% ~15s          
  |++++++++++++++++++++++                            | 44% ~15s          
  |+++++++++++++++++++++++                           | 45% ~15s          
  |+++++++++++++++++++++++                           | 46% ~15s          
  |++++++++++++++++++++++++                          | 47% ~14s          
  |++++++++++++++++++++++++                          | 48% ~14s          
  |+++++++++++++++++++++++++                         | 49% ~14s          
  |+++++++++++++++++++++++++                         | 50% ~14s          
  |++++++++++++++++++++++++++                        | 51% ~14s          
  |+++++++++++++++++++++++++++                       | 52% ~13s          
  |+++++++++++++++++++++++++++                       | 53% ~13s          
  |++++++++++++++++++++++++++++                      | 54% ~13s          
  |++++++++++++++++++++++++++++                      | 55% ~12s          
  |+++++++++++++++++++++++++++++                     | 56% ~12s          
  |+++++++++++++++++++++++++++++                     | 57% ~12s          
  |++++++++++++++++++++++++++++++                    | 58% ~11s          
  |++++++++++++++++++++++++++++++                    | 59% ~11s          
  |+++++++++++++++++++++++++++++++                   | 60% ~11s          
  |+++++++++++++++++++++++++++++++                   | 61% ~10s          
  |++++++++++++++++++++++++++++++++                  | 62% ~10s          
  |++++++++++++++++++++++++++++++++                  | 63% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~09s          
  |++++++++++++++++++++++++++++++++++                | 66% ~09s          
  |++++++++++++++++++++++++++++++++++                | 67% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~08s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=27s  
DT::datatable(BC.markers)
BC_Volcano_TargetsA = EnhancedVolcano(BC.markers,
    lab = rownames(BC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "B-cell markers\n(B-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
BC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.BC.DEG.Targets.pdf"), 
       plot = BC_Volcano_TargetsA)
Saving 7.29 x 4.51 in image

The target results are given below and written to a file.

library(tibble)
BC.markers <- add_column(BC.markers, Gene = row.names(BC.markers), .before = 1)

temp <- BC.markers[BC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".BC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.6 Mast cells

Comparison between the mast cell communities (KIT+), and all other communities.

N_GENES=20552
MC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("KIT+ MC"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8A+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+ Treg", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      # "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~43s          
  |++                                                | 2 % ~41s          
  |++                                                | 3 % ~39s          
  |+++                                               | 4 % ~37s          
  |+++                                               | 5 % ~36s          
  |++++                                              | 6 % ~35s          
  |++++                                              | 7 % ~34s          
  |+++++                                             | 8 % ~34s          
  |+++++                                             | 9 % ~33s          
  |++++++                                            | 10% ~32s          
  |++++++                                            | 11% ~32s          
  |+++++++                                           | 12% ~32s          
  |+++++++                                           | 13% ~32s          
  |++++++++                                          | 14% ~31s          
  |++++++++                                          | 15% ~31s          
  |+++++++++                                         | 16% ~31s          
  |+++++++++                                         | 17% ~45s          
  |++++++++++                                        | 18% ~44s          
  |++++++++++                                        | 19% ~43s          
  |+++++++++++                                       | 20% ~41s          
  |+++++++++++                                       | 21% ~40s          
  |++++++++++++                                      | 22% ~39s          
  |++++++++++++                                      | 23% ~38s          
  |+++++++++++++                                     | 24% ~37s          
  |+++++++++++++                                     | 25% ~36s          
  |++++++++++++++                                    | 26% ~35s          
  |++++++++++++++                                    | 27% ~35s          
  |+++++++++++++++                                   | 28% ~34s          
  |+++++++++++++++                                   | 29% ~33s          
  |++++++++++++++++                                  | 30% ~32s          
  |++++++++++++++++                                  | 31% ~31s          
  |+++++++++++++++++                                 | 32% ~31s          
  |+++++++++++++++++                                 | 33% ~30s          
  |++++++++++++++++++                                | 34% ~29s          
  |++++++++++++++++++                                | 35% ~29s          
  |+++++++++++++++++++                               | 36% ~28s          
  |+++++++++++++++++++                               | 37% ~28s          
  |++++++++++++++++++++                              | 38% ~27s          
  |++++++++++++++++++++                              | 39% ~27s          
  |+++++++++++++++++++++                             | 40% ~26s          
  |+++++++++++++++++++++                             | 41% ~26s          
  |++++++++++++++++++++++                            | 42% ~25s          
  |++++++++++++++++++++++                            | 43% ~25s          
  |+++++++++++++++++++++++                           | 44% ~24s          
  |+++++++++++++++++++++++                           | 45% ~23s          
  |++++++++++++++++++++++++                          | 46% ~23s          
  |++++++++++++++++++++++++                          | 47% ~22s          
  |+++++++++++++++++++++++++                         | 48% ~22s          
  |+++++++++++++++++++++++++                         | 49% ~21s          
  |++++++++++++++++++++++++++                        | 51% ~21s          
  |++++++++++++++++++++++++++                        | 52% ~21s          
  |+++++++++++++++++++++++++++                       | 53% ~20s          
  |+++++++++++++++++++++++++++                       | 54% ~20s          
  |++++++++++++++++++++++++++++                      | 55% ~19s          
  |++++++++++++++++++++++++++++                      | 56% ~19s          
  |+++++++++++++++++++++++++++++                     | 57% ~18s          
  |+++++++++++++++++++++++++++++                     | 58% ~18s          
  |++++++++++++++++++++++++++++++                    | 59% ~17s          
  |++++++++++++++++++++++++++++++                    | 60% ~17s          
  |+++++++++++++++++++++++++++++++                   | 61% ~16s          
  |+++++++++++++++++++++++++++++++                   | 62% ~16s          
  |++++++++++++++++++++++++++++++++                  | 63% ~16s          
  |++++++++++++++++++++++++++++++++                  | 64% ~15s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~15s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~14s          
  |++++++++++++++++++++++++++++++++++                | 67% ~14s          
  |++++++++++++++++++++++++++++++++++                | 68% ~13s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~13s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~13s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~12s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~12s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~11s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~11s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~10s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~10s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~10s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~09s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~09s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=40s  
DT::datatable(MC.markers)
MC_Volcano_TargetsA = EnhancedVolcano(MC.markers,
    lab = rownames(MC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Mast cell markers\n(Mast cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
MC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MC.DEG.Targets.pdf"), 
       plot = MC_Volcano_TargetsA)
Saving 7.29 x 4.51 in image

The target results are given below and written to a file.

library(tibble)
MC.markers <- add_column(MC.markers, Gene = row.names(MC.markers), .before = 1)

temp <- MC.markers[MC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.7 NK-cells

Comparison between the natural killer cell communities (NCAM1+), and all other communities.

N_GENES=20552
NK.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("NCAM1+ NK"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8A+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+ Treg", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      "Mixed I",
                                      "Mixed II",
                                      #"NCAM1+ NK",
                                      "ACTA2+ SMC", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~20s          
  |++                                                | 2 % ~19s          
  |++                                                | 3 % ~19s          
  |+++                                               | 4 % ~22s          
  |+++                                               | 5 % ~22s          
  |++++                                              | 6 % ~21s          
  |++++                                              | 7 % ~21s          
  |+++++                                             | 8 % ~23s          
  |+++++                                             | 9 % ~22s          
  |++++++                                            | 10% ~22s          
  |++++++                                            | 11% ~21s          
  |+++++++                                           | 12% ~20s          
  |+++++++                                           | 13% ~20s          
  |++++++++                                          | 14% ~19s          
  |++++++++                                          | 15% ~19s          
  |+++++++++                                         | 16% ~19s          
  |+++++++++                                         | 17% ~18s          
  |++++++++++                                        | 18% ~18s          
  |++++++++++                                        | 19% ~18s          
  |+++++++++++                                       | 20% ~17s          
  |+++++++++++                                       | 21% ~17s          
  |++++++++++++                                      | 22% ~17s          
  |++++++++++++                                      | 23% ~16s          
  |+++++++++++++                                     | 24% ~16s          
  |+++++++++++++                                     | 25% ~16s          
  |++++++++++++++                                    | 26% ~16s          
  |++++++++++++++                                    | 27% ~15s          
  |+++++++++++++++                                   | 28% ~15s          
  |+++++++++++++++                                   | 29% ~15s          
  |++++++++++++++++                                  | 30% ~15s          
  |++++++++++++++++                                  | 31% ~14s          
  |+++++++++++++++++                                 | 32% ~14s          
  |+++++++++++++++++                                 | 33% ~14s          
  |++++++++++++++++++                                | 34% ~14s          
  |++++++++++++++++++                                | 35% ~13s          
  |+++++++++++++++++++                               | 36% ~13s          
  |+++++++++++++++++++                               | 37% ~13s          
  |++++++++++++++++++++                              | 38% ~13s          
  |++++++++++++++++++++                              | 39% ~13s          
  |+++++++++++++++++++++                             | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~12s          
  |++++++++++++++++++++++                            | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~12s          
  |+++++++++++++++++++++++                           | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~11s          
  |++++++++++++++++++++++++                          | 46% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |+++++++++++++++++++++++++                         | 48% ~11s          
  |+++++++++++++++++++++++++                         | 49% ~11s          
  |++++++++++++++++++++++++++                        | 51% ~11s          
  |++++++++++++++++++++++++++                        | 52% ~10s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |+++++++++++++++++++++++++++                       | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~10s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |+++++++++++++++++++++++++++++                     | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~09s          
  |++++++++++++++++++++++++++++++                    | 60% ~09s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |++++++++++++++++++++++++++++++++++                | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=22s  
DT::datatable(NK.markers)
NK_Volcano_TargetsA = EnhancedVolcano(NK.markers,
    lab = rownames(NK.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "NK markers\n(NK-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
NK_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.NK.DEG.Targets.pdf"), 
       plot = NK_Volcano_TargetsA)
Saving 7.29 x 4.51 in image

The target results are given below and written to a file.

library(tibble)
NK.markers <- add_column(NK.markers, Gene = row.names(NK.markers), .before = 1)

temp <- NK.markers[NK.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".NK.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.8 Mixed cells

Comparison between the mixed cell communities, and all other communities.

N_GENES=20552
MIXED.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("Mixed I", 
                                      "Mixed II"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8A+ T I",
                                      "CD3+CD8A+ T II ", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3+ Treg", 
                                      "CD34+ EC I", "CD34+ EC II",
                                      # "Mixed I", 
                                      # "Mixed II", 
                                      "ACTA2+ SMC", 
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 18s      
  |++                                                | 2 % ~01m 16s      
  |++                                                | 3 % ~01m 14s      
  |+++                                               | 4 % ~01m 11s      
  |+++                                               | 5 % ~01m 10s      
  |++++                                              | 6 % ~01m 09s      
  |++++                                              | 7 % ~01m 08s      
  |+++++                                             | 8 % ~01m 07s      
  |+++++                                             | 9 % ~01m 06s      
  |++++++                                            | 10% ~01m 05s      
  |++++++                                            | 11% ~01m 08s      
  |+++++++                                           | 12% ~01m 07s      
  |+++++++                                           | 13% ~01m 06s      
  |++++++++                                          | 14% ~01m 05s      
  |++++++++                                          | 15% ~01m 04s      
  |+++++++++                                         | 16% ~01m 03s      
  |+++++++++                                         | 17% ~01m 01s      
  |++++++++++                                        | 18% ~60s          
  |++++++++++                                        | 19% ~59s          
  |+++++++++++                                       | 20% ~01m 17s      
  |+++++++++++                                       | 21% ~01m 15s      
  |++++++++++++                                      | 22% ~01m 13s      
  |++++++++++++                                      | 23% ~01m 11s      
  |+++++++++++++                                     | 24% ~01m 09s      
  |+++++++++++++                                     | 26% ~01m 07s      
  |++++++++++++++                                    | 27% ~01m 06s      
  |++++++++++++++                                    | 28% ~01m 04s      
  |+++++++++++++++                                   | 29% ~01m 02s      
  |+++++++++++++++                                   | 30% ~01m 02s      
  |++++++++++++++++                                  | 31% ~01m 01s      
  |++++++++++++++++                                  | 32% ~01m 00s      
  |+++++++++++++++++                                 | 33% ~59s          
  |+++++++++++++++++                                 | 34% ~58s          
  |++++++++++++++++++                                | 35% ~58s          
  |++++++++++++++++++                                | 36% ~56s          
  |+++++++++++++++++++                               | 37% ~55s          
  |+++++++++++++++++++                               | 38% ~54s          
  |++++++++++++++++++++                              | 39% ~53s          
  |++++++++++++++++++++                              | 40% ~52s          
  |+++++++++++++++++++++                             | 41% ~51s          
  |+++++++++++++++++++++                             | 42% ~50s          
  |++++++++++++++++++++++                            | 43% ~50s          
  |++++++++++++++++++++++                            | 44% ~49s          
  |+++++++++++++++++++++++                           | 45% ~48s          
  |+++++++++++++++++++++++                           | 46% ~47s          
  |++++++++++++++++++++++++                          | 47% ~46s          
  |++++++++++++++++++++++++                          | 48% ~45s          
  |+++++++++++++++++++++++++                         | 49% ~44s          
  |+++++++++++++++++++++++++                         | 50% ~43s          
  |++++++++++++++++++++++++++                        | 51% ~43s          
  |+++++++++++++++++++++++++++                       | 52% ~42s          
  |+++++++++++++++++++++++++++                       | 53% ~41s          
  |++++++++++++++++++++++++++++                      | 54% ~40s          
  |++++++++++++++++++++++++++++                      | 55% ~39s          
  |+++++++++++++++++++++++++++++                     | 56% ~38s          
  |+++++++++++++++++++++++++++++                     | 57% ~37s          
  |++++++++++++++++++++++++++++++                    | 58% ~37s          
  |++++++++++++++++++++++++++++++                    | 59% ~36s          
  |+++++++++++++++++++++++++++++++                   | 60% ~35s          
  |+++++++++++++++++++++++++++++++                   | 61% ~34s          
  |++++++++++++++++++++++++++++++++                  | 62% ~33s          
  |++++++++++++++++++++++++++++++++                  | 63% ~32s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~31s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~31s          
  |++++++++++++++++++++++++++++++++++                | 66% ~30s          
  |++++++++++++++++++++++++++++++++++                | 67% ~29s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~28s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~27s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~26s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~25s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~24s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~23s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~22s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~21s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~20s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~19s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~19s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~17s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~16s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 23s
DT::datatable(MIXED.markers)
MIXED_Volcano_TargetsA = EnhancedVolcano(MIXED.markers,
    lab = rownames(MIXED.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Mixed markers\n(Mixed cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels =c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
MIXED_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MIXED.DEG.Targets.pdf"), 
       plot = MIXED_Volcano_TargetsA)
Saving 7.29 x 4.51 in image

The target results are given below and written to a file.

library(tibble)
MIXED.markers <- add_column(MIXED.markers, Gene = row.names(MIXED.markers), .before = 1)

temp <- MIXED.markers[MIXED.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MIXED.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

5 Top hits

Dotplots of known and novel genes.

Some genes were not found in our data.

  • DMRTA1 (known)
  • LINC00841 (novel)
  • LOC100130539 (novel)
library(RColorBrewer)
# "C6orf195"     "EDN1"         "PHACTR1"      "TBC1D7"       "GFOD1"        "ENPP1"        "ENPP3"        "IGFBP3"      
# "AC011294.3"   "MTAP"         "RP11-145E5.5" "C9orf53"      "CDKN2A"       "CDKN2B"       "ZNF485"       "ZNF32"       
# "AL137026.1"   "ARID5B"       "RTKN2"        "CAMK2G"       "VCL"          "AP3M1"        "ADK"          "KAT6B"       
# "DUPD1"        "DUSP13"       "SAMD8"        "VDAC2"        "COMTD1"       "FGF23"        "COL4A1"       "COL4A2"      
# "CHRNA5"       "CHRNB4"       "ADAMTS7"      "MORF4L1"      "CTSH"         "BCAM"         "PVRL2"        "TOMM40"      
# "APOE"         "APOC1"       

tophits_known <- c("PHACTR1", "CDKN2B-AS1","APOE") # DMRTA1 not found in the data
tophits_novel <- c("ENPP3", "ENPP1", "IGFBP3","ARID5B","ADK", "FGF23", "COL4A2", "ADAMTS7", "MORF4L1") # "LINC00841", "LOC100130539" not found in the data


p1 <- DotPlot(scRNAseqData, features = tophits_known,
        cols = "RdBu")

p1 + theme(axis.text.x = element_text(angle = 45, hjust=1, size = 5))

ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.TopHits.known.png"), plot = last_plot())
Saving 7.29 x 4.51 in image
ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.TopHits.known.ps"), plot = last_plot())
Saving 7.29 x 4.51 in image

rm(p1)

p1 <- DotPlot(scRNAseqData, features = tophits_novel,
        cols = "RdBu")

p1 + theme(axis.text.x = element_text(angle = 45, hjust=1, size = 5))

ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.TopHits.novel.png"), plot = last_plot())
Saving 7.29 x 4.51 in image
ggsave(paste0(PLOT_loc, "/", Today, ".DotPlot.TopHits.novel.ps"), plot = last_plot())
Saving 7.29 x 4.51 in image

rm(p1)

6 Session information


Version:      v1.0.2
Last update:  2021-07-15
Written by:   Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl).
Description:  Script to load single-cell RNA sequencing (scRNAseq) data, and perform quality control (QC), and initial mapping to cells.
Minimum requirements: R version 3.5.2 (2018-12-20) -- 'Eggshell Igloo', macOS Mojave (10.14.2).

Change log
* v1.0.2 Update to the gene list, workflow, and dataset.
* v1.0.1 Update to the gene list.
* v1.0.0 Initial version

sessionInfo()
R version 4.1.0 (2021-05-18)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur 11.4

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
 [1] parallel  stats4    tools     stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] RColorBrewer_1.1-2     labelled_2.8.0         openxlsx_4.2.4         SeuratObject_4.0.2     Seurat_4.0.1          
 [6] devtools_2.4.2         usethis_2.0.1          tableone_0.13.0        haven_2.4.1            EnhancedVolcano_1.10.0
[11] ggrepel_0.9.1          mygene_1.28.0          GenomicFeatures_1.44.0 GenomicRanges_1.44.0   GenomeInfoDb_1.28.1   
[16] org.Hs.eg.db_3.13.0    AnnotationDbi_1.54.1   IRanges_2.26.0         S4Vectors_0.30.0       Biobase_2.52.0        
[21] BiocGenerics_0.38.0    DT_0.18                knitr_1.33             forcats_0.5.1          stringr_1.4.0         
[26] purrr_0.3.4            tibble_3.1.2           ggplot2_3.3.5          tidyverse_1.3.1        data.table_1.14.0     
[31] naniar_0.6.1           tidylog_1.0.2          tidyr_1.1.3            dplyr_1.0.7            optparse_1.6.6        
[36] readr_1.4.0           

loaded via a namespace (and not attached):
  [1] rappdirs_0.3.3              rtracklayer_1.52.0          scattermore_0.7             ragg_1.1.3                 
  [5] visdat_0.5.3                bit64_4.0.5                 irlba_2.3.3                 DelayedArray_0.18.0        
  [9] rpart_4.1-15                KEGGREST_1.32.0             RCurl_1.98-1.3              generics_0.1.0             
 [13] callr_3.7.0                 cowplot_1.1.1               RSQLite_2.2.7               RANN_2.6.1                 
 [17] proxy_0.4-26                future_1.21.0               chron_2.3-56                bit_4.0.4                  
 [21] spatstat.data_2.1-0         xml2_1.3.2                  lubridate_1.7.10            httpuv_1.6.1               
 [25] SummarizedExperiment_1.22.0 assertthat_0.2.1            xfun_0.24                   jquerylib_0.1.4            
 [29] hms_1.1.0                   evaluate_0.14               promises_1.2.0.1            fansi_0.5.0                
 [33] restfulr_0.0.13             progress_1.2.2              dbplyr_2.1.1                readxl_1.3.1               
 [37] igraph_1.2.6                DBI_1.1.1                   htmlwidgets_1.5.3           spatstat.geom_2.2-2        
 [41] ellipsis_0.3.2              crosstalk_1.1.1             backports_1.2.1             survey_4.0                 
 [45] biomaRt_2.48.2              deldir_0.2-10               MatrixGenerics_1.4.0        vctrs_0.3.8                
 [49] remotes_2.4.0               ROCR_1.0-11                 abind_1.4-5                 cachem_1.0.5               
 [53] withr_2.4.2                 checkmate_2.0.0             sctransform_0.3.2           GenomicAlignments_1.28.0   
 [57] prettyunits_1.1.1           getopt_1.20.3               goftest_1.2-2               cluster_2.1.2              
 [61] lazyeval_0.2.2              crayon_1.4.1                labeling_0.4.2              pkgconfig_2.0.3            
 [65] pkgload_1.2.1               nlme_3.1-152                vipor_0.4.5                 nnet_7.3-16                
 [69] rlang_0.4.11                globals_0.14.0              lifecycle_1.0.0             miniUI_0.1.1.1             
 [73] filelock_1.0.2              extrafontdb_1.0             BiocFileCache_2.0.0         modelr_0.1.8               
 [77] rprojroot_2.0.2             ggrastr_0.2.3               cellranger_1.1.0            polyclip_1.10-0            
 [81] matrixStats_0.59.0          lmtest_0.9-38               Matrix_1.3-4                zoo_1.8-9                  
 [85] reprex_2.0.0                base64enc_0.1-3             beeswarm_0.4.0              processx_3.5.2             
 [89] ggridges_0.5.3              png_0.1-7                   viridisLite_0.4.0           rjson_0.2.20               
 [93] clisymbols_1.2.0            bitops_1.0-7                KernSmooth_2.23-20          Biostrings_2.60.1          
 [97] blob_1.2.1                  parallelly_1.26.1           jpeg_0.1-8.1                scales_1.1.1               
[101] memoise_2.0.0               magrittr_2.0.1              plyr_1.8.6                  ica_1.0-2                  
[105] zlibbioc_1.38.0             compiler_4.1.0              BiocIO_1.2.0                ash_1.0-15                 
[109] fitdistrplus_1.1-5          Rsamtools_2.8.0             cli_3.0.0                   XVector_0.32.0             
[113] listenv_0.8.0               ps_1.6.0                    patchwork_1.1.1             pbapply_1.4-3              
[117] htmlTable_2.2.1             Formula_1.2-4               MASS_7.3-54                 mgcv_1.8-36                
[121] tidyselect_1.1.1            stringi_1.7.2               textshaping_0.3.5           proj4_1.0-10.1             
[125] mitools_2.4                 yaml_2.2.1                  latticeExtra_0.6-29         grid_4.1.0                 
[129] sass_0.4.0                  future.apply_1.7.0          rstudioapi_0.13             foreign_0.8-81             
[133] gridExtra_2.3               farver_2.1.0                Rtsne_0.15                  digest_0.6.27              
[137] shiny_1.6.0                 proto_1.0.0                 Rcpp_1.0.7                  broom_0.7.8                
[141] ggalt_0.4.0                 later_1.2.0                 RcppAnnoy_0.0.18            httr_1.4.2                 
[145] colorspace_2.0-2            rvest_1.0.0                 XML_3.99-0.6                fs_1.5.0                   
[149] tensor_1.5                  reticulate_1.20             splines_4.1.0               uwot_0.1.10                
[153] spatstat.utils_2.2-0        systemfonts_1.0.2           sessioninfo_1.1.1           plotly_4.9.4.1             
[157] xtable_1.8-4                jsonlite_1.7.2              testthat_3.0.4              R6_2.5.0                   
[161] Hmisc_4.5-0                 gsubfn_0.7                  pillar_1.6.1                htmltools_0.5.1.1          
[165] mime_0.11                   glue_1.4.2                  fastmap_1.1.0               BiocParallel_1.26.1        
[169] class_7.3-19                codetools_0.2-18            maps_3.3.0                  pkgbuild_1.2.0             
[173] utf8_1.2.1                  bslib_0.2.5.1               lattice_0.20-44             spatstat.sparse_2.0-0      
[177] sqldf_0.4-11                curl_4.3.2                  ggbeeswarm_0.6.0            leiden_0.3.8               
[181] zip_2.2.0                   Rttf2pt1_1.3.8              survival_3.2-11             rmarkdown_2.9              
[185] desc_1.3.0                  munsell_0.5.0               e1071_1.7-7                 GenomeInfoDbData_1.2.6     
[189] reshape2_1.4.4              gtable_0.3.0                spatstat.core_2.2-0         extrafont_0.17             

7 Saving environment

save.image(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".scrnaseq_results.RData"))
© 1979-2021 Sander W. van der Laan | s.w.vanderlaan-2[at]umcutrecht.nl | swvanderlaan.github.io.
LS0tCnRpdGxlOiAiTWFwcGluZyBDQUMgc3VzY2VwdGliaWxpdHkgbG9jaSB3aXRoIHNpbmdsZS1jZWxsIHJlc29sdXRpb24gaW4gY2Fyb3RpZCBwbGFxdWVzLiIKYXV0aG9yOiAnW1NhbmRlciBXLiB2YW4gZGVyIExhYW4sIFBoRF0oaHR0cHM6Ly9zd3ZhbmRlcmxhYW4uZ2l0aHViLmlvKSB8IEBzd3ZhbmRlcmxhYW4nCmRhdGU6ICdgciBTeXMuRGF0ZSgpYCcKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgY2FjaGU6IHllcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2xsYXBzZTogeWVzCiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZy5hbGlnbjogY2VudGVyCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBmaWdfaGVpZ2h0OiAxMAogICAgZmlnX3JldGluYTogMgogICAgZmlnX3dpZHRoOiAxMgogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBwYXBlcgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBubwogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKbWFpbmZvbnQ6IEhlbHZldGljYQpzdWJ0aXRsZTogQSAnZHJ1Z2dhYmxlLU1JLXRhcmdldHMnIHByb2plY3QKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CiMgZnVydGhlciBkZWZpbmUgc29tZSBrbml0ci1vcHRpb25zLgprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4LCBmaWcucGF0aCA9ICdGaWd1cmVzLycsCiAgICAgICAgICAgICAgICAgICAgICBldmFsID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmBgYAoKX0NsZWFuIHRoZSBlbnZpcm9ubWVudC5fCmBgYHtyIENsZWFyRW52aXJvbm1lbnQsIGVjaG8gPSBGQUxTRX0Kcm0obGlzdCA9IGxzKCkpCmBgYAoKX1NldCBsb2NhdGlvbnMsIGFuZCB0aGUgd29ya2luZyBkaXJlY3RvcnkgLi4uXwpgYGB7ciBMb2NhbFN5c3RlbSwgZWNobyA9IEZBTFNFfQojIyMgT3BlcmF0aW5nIFN5c3RlbSBWZXJzaW9uCiMjIyBNYWMgUHJvCiMgUk9PVF9sb2MgPSAiL1ZvbHVtZXMvRWxpdGVQcm9ReDJNZWRpYSIKIyBHRU5PTUlDX2xvYyA9ICIvVXNlcnMvc3ZhbmRlcmxhYW4vaUNsb3VkL0dlbm9taWNzIgoKIyMjIE1hY0Jvb2sKUk9PVF9sb2MgPSAiL1VzZXJzL3NsYWFuMy9PbmVEcml2ZSAtIFVNQyBVdHJlY2h0IgpHRU5PTUlDX2xvYyA9IHBhc3RlMChST09UX2xvYywgIi9HZW5vbWljcyIpCgojIyMgR2VuZXJpYyBMb2NhdGlvbnMKQUVEQl9sb2MgPSBwYXN0ZTAoR0VOT01JQ19sb2MsICIvQXRoZXJvLUV4cHJlc3MvQUUtQUFBX0dTX0RCcyIpCkxBQl9sb2MgPSBwYXN0ZTAoR0VOT01JQ19sb2MsICIvTGFiQnVzaW5lc3MiKQoKUkFXREFUQSA9IHBhc3RlMChST09UX2xvYywgIi9QTElOSy9fQUVfT1JJR0lOQUxTL0FFU0NSTkEvcHJlcHBlZF9kYXRhIikKClBST0pFQ1RfbG9jID0gcGFzdGUwKFJPT1RfbG9jLCAiL1BMSU5LL2FuYWx5c2VzL2xvb2t1cHMvQUVfMjAyMDA1MTJfQ09MX01LQVZPVVNJX01CT1NfQ0hBUkdFXzEwMDBHX0NBQyIpClJFU1VMVFMgPSBwYXN0ZTAoUk9PVF9sb2MsICIvUExJTksvYW5hbHlzZXMvbG9va3Vwcy9BRV8yMDIwMDUxMl9DT0xfTUtBVk9VU0lfTUJPU19DSEFSR0VfMTAwMEdfQ0FDL3NjUk5Bc2VxIikKClRBUkdFVF9sb2MgPSBwYXN0ZTAoR0VOT01JQ19sb2MsICIvQXRoZXJvLUV4cHJlc3MvRm9ybXMvMjAyMC9BRV8yMDIwMDUxMl9DT0xfTUtBVk9VU0lfTUJPU19DSEFSR0VfMTAwMEdfQ0FDIikKCiMjIyBTT01FIFZBUklBQkxFUyBXRSBORUVEIERPV04gVEhFIExJTkUKY2F0KCJcbkRlZmluaW5nIHBoZW5vdHlwZXMgYW5kIGRhdGFzZXRzLlxuIikKUFJPSkVDVE5BTUU9IkFFU0NSTkEiCgpjYXQoIlxuQ3JlYXRlIGEgbmV3IGFuYWx5c2lzIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHN1YmRpcmVjdG9yaWVzLlxuIikKIyBBbmFseXNpcwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFJFU1VMVFMsICIvIixQUk9KRUNUTkFNRSkpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFJFU1VMVFMsICIvIixQUk9KRUNUTkFNRSkpLCAKICAgICAgIEZBTFNFKQpBTkFMWVNJU19sb2MgPSBwYXN0ZTAoUkVTVUxUUywiLyIsUFJPSkVDVE5BTUUpCgojIFBsb3RzCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL1BMT1RTIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9QTE9UUyIpKSwgCiAgICAgICBGQUxTRSkKUExPVF9sb2MgPSBwYXN0ZTAoQU5BTFlTSVNfbG9jLCIvUExPVFMiKQoKIyBRQyBwbG90cwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1FDIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1FDIikpLCAKICAgICAgIEZBTFNFKQpRQ19sb2MgPSBwYXN0ZTAoUExPVF9sb2MsIi9RQyIpCgojIE91dHB1dCBmaWxlcwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9PVVRQVVQiKSksIAogICAgICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL09VVFBVVCIpKSwgCiAgICAgICBGQUxTRSkKT1VUX2xvYyA9IHBhc3RlMChBTkFMWVNJU19sb2MsICIvT1VUUFVUIikKCmNhdCgiXG5TZXR0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBsaXN0aW5nIGl0cyBjb250ZW50cy5cbiIpCnNldHdkKHBhc3RlMChSRVNVTFRTKSkKZ2V0d2QoKQpsaXN0LmZpbGVzKCkKYGBgCgpfLi4uIGEgcGFja2FnZS1pbnN0YWxsYXRpb24gZnVuY3Rpb24gLi4uXwpgYGB7ciBGdW5jdGlvbjogaW5zdGFsbGF0aW9ucywgZWNobz1GQUxTRX0KaW5zdGFsbC5wYWNrYWdlcy5hdXRvIDwtIGZ1bmN0aW9uKHgpIHsgCiAgeCA8LSBhcy5jaGFyYWN0ZXIoc3Vic3RpdHV0ZSh4KSkgCiAgaWYoaXNUUlVFKHggJWluJSAucGFja2FnZXMoYWxsLmF2YWlsYWJsZSA9IFRSVUUpKSkgeyAKICAgIGV2YWwocGFyc2UodGV4dCA9IHNwcmludGYoInJlcXVpcmUoXCIlc1wiKSIsIHgpKSkKICB9IGVsc2UgeyAKICAgICMgVXBkYXRlIGluc3RhbGxlZCBwYWNrYWdlcyAtIHRoaXMgbWF5IG1lYW4gYSBmdWxsIHVwZ3JhZGUgb2YgUiwgd2hpY2ggaW4gdHVybgogICAgIyBtYXkgbm90IGJlIHdhcnJlbnRlZC4gCiAgICAjIHVwZGF0ZS5pbnN0YWxsLnBhY2thZ2VzLmF1dG8oYXNrID0gRkFMU0UpIAogICAgZXZhbChwYXJzZSh0ZXh0ID0gc3ByaW50ZigiaW5zdGFsbC5wYWNrYWdlcyhcIiVzXCIsIGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gXCJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmcvXCIpIiwgeCkpKQogIH0KICBpZihpc1RSVUUoeCAlaW4lIC5wYWNrYWdlcyhhbGwuYXZhaWxhYmxlID0gVFJVRSkpKSB7IAogICAgZXZhbChwYXJzZSh0ZXh0ID0gc3ByaW50ZigicmVxdWlyZShcIiVzXCIpIiwgeCkpKQogIH0gZWxzZSB7CiAgICBpZiAoIXJlcXVpcmVOYW1lc3BhY2UoIkJpb2NNYW5hZ2VyIikpCiAgICAgIGluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikKICAgICMgQmlvY01hbmFnZXI6Omluc3RhbGwoKSAjIHRoaXMgd291bGQgZW50YWlsIHVwZGF0aW5nIGluc3RhbGxlZCBwYWNrYWdlcywgd2hpY2ggaW4gdHVybmVkIG1heSBub3QgYmUgd2FycmVudGVkCiAgICBldmFsKHBhcnNlKHRleHQgPSBzcHJpbnRmKCJCaW9jTWFuYWdlcjo6aW5zdGFsbChcIiVzXCIpIiwgeCkpKQogICAgZXZhbChwYXJzZSh0ZXh0ID0gc3ByaW50ZigicmVxdWlyZShcIiVzXCIpIiwgeCkpKQogIH0KfQpgYGAKCl8uLi4gYW5kIGxvYWQgdGhvc2UgcGFja2FnZXMuXwpgYGB7ciBTZXR0aW5nOiBsb2FkaW5nX3BhY2thZ2VzLCBlY2hvPUZBTFNFfQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInJlYWRyIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJvcHRwYXJzZSIpCmluc3RhbGwucGFja2FnZXMuYXV0bygidG9vbHMiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oImRwbHlyIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJ0aWR5ciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygidGlkeWxvZyIpCmxpYnJhcnkoInRpZHlsb2ciLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIm5hbmlhciIpCgojIFRvIGdldCAnZGF0YS50YWJsZScgd2l0aCAnZndyaXRlJyB0byBiZSBhYmxlIHRvIGRpcmVjdGx5IHdyaXRlIGd6aXBwZWQtZmlsZXMKIyBSZWY6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQyNzg4NDAxL2lzLXBvc3NpYmxlLXRvLXVzZS1md3JpdGUtZnJvbS1kYXRhLXRhYmxlLXdpdGgtZ3pmaWxlCiMgaW5zdGFsbC5wYWNrYWdlcygiZGF0YS50YWJsZSIsIHJlcG9zID0gImh0dHBzOi8vUmRhdGF0YWJsZS5naXRsYWIuaW8vZGF0YS50YWJsZSIpCmxpYnJhcnkoZGF0YS50YWJsZSkKCmluc3RhbGwucGFja2FnZXMuYXV0bygidGlkeXZlcnNlIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJrbml0ciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygiRFQiKQoKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJvcmcuSHMuZWcuZGIiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIm15Z2VuZSIpCmluc3RhbGwucGFja2FnZXMuYXV0bygiRW5oYW5jZWRWb2xjYW5vIikKCmluc3RhbGwucGFja2FnZXMuYXV0bygiaGF2ZW4iKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInRhYmxlb25lIikKCiMgaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJTZXVyYXQiKSAjIGxhdGVzdCB2ZXJzaW9uCgojIEluc3RhbGwgdGhlIGRldnRvb2xzIHBhY2thZ2UgZnJvbSBIYWRsZXkgV2lja2hhbQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oJ2RldnRvb2xzJykKIyBSZXBsYWNlICcyLjMuNCcgd2l0aCB5b3VyIGRlc2lyZWQgdmVyc2lvbgojIGRldnRvb2xzOjppbnN0YWxsX3ZlcnNpb24ocGFja2FnZSA9ICdTZXVyYXQnLCB2ZXJzaW9uID0gcGFja2FnZV92ZXJzaW9uKCcyLjMuNCcpKQojIGluc3RhbGwucGFja2FnZXMoIlNldXJhdCIpCmxpYnJhcnkoIlNldXJhdCIpCgoKYGBgCgpfV2Ugd2lsbCBjcmVhdGUgYSBkYXRlc3RhbXAgYW5kIGRlZmluZSB0aGUgVXRyZWNodCBTY2llbmNlIFBhcmsgQ29sb3VyIFNjaGVtZV8uCmBgYHtyIFNldHRpbmc6IENvbG9ycywgZWNobz1GQUxTRX0KClRvZGF5ID0gZm9ybWF0KGFzLkRhdGUoYXMuUE9TSVhsdChTeXMudGltZSgpKSksICIlWSVtJWQiKQpUb2RheS5SZXBvcnQgPSBmb3JtYXQoYXMuRGF0ZShhcy5QT1NJWGx0KFN5cy50aW1lKCkpKSwgIiVBLCAlQiAlZCwgJVkiKQoKIyMjIFV0cmVjaHRTY2llbmNlUGFya0NvbG91cnNTY2hlbWUKIyMjCiMjIyBXZWJzaXRldG9jb252ZXJ0SEVYdG9SR0I6aHR0cDovL2hleC5jb2xvcnJycy5jb20uCiMjIyBGb3Jzb21lZnVuY3Rpb25zeW91c2hvdWxkZGl2aWRldGhlc2VudW1iZXJzYnkyNTUuCiMjIyAKIyMjCU5vLglDb2xvcgkJCSAgICAgIEhFWAkoUkdCKQkJCQkJCSAgICAgICAgICAgICAgQ0hSCQkgIE1BRi9JTkZPCiMjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIyMJMQkgIHllbGxvdwkJCSAgICAjRkJCODIwICgyNTEsMTg0LDMyKQkJCQkgICAgICA9PgkxCQlvciAxLjA+SU5GTwojIyMJMgkgIGdvbGQJCQkgICAgICAjRjU5RDEwICgyNDUsMTU3LDE2KQkJCQkgICAgICA9PgkyCQkKIyMjCTMJICBzYWxtb24JCQkgICAgI0U1NTczOCAoMjI5LDg3LDU2KQkJCQkgICAgICA9PgkzCQlvciAwLjA1PE1BRjwwLjIgb3IgMC40PElORk88MC42CiMjIwk0CSAgZGFya3BpbmsJCSAgICAjREIwMDNGICgoMjE5LDAsNjMpCQkJCSAgICAgID0+CTQJCQojIyMJNQkgIGxpZ2h0cGluawkJICAgICNFMzU0OTMgKDIyNyw4NCwxNDcpCQkJCSAgICAgID0+CTUJCW9yIDAuODxJTkZPPDEuMAojIyMJNgkgIHBpbmsJCQkgICAgICAjRDUyNjdCICgyMTMsMzgsMTIzKQkJCQkgICAgICA9Pgk2CQkKIyMjCTcJICBoYXJkcGluawkJICAgICNDQzAwNzEgKDIwNCwwLDExMykJCQkJICAgICAgPT4JNwkJCiMjIwk4CSAgbGlnaHRwdXJwbGUJICAgICNBODQ0OEEgKDE2OCw2OCwxMzgpCQkJCSAgICAgID0+CTgJCQojIyMJOQkgIHB1cnBsZQkJCSAgICAjOUEzNDgwICgxNTQsNTIsMTI4KQkJCQkgICAgICA9Pgk5CQkKIyMjCTEwCWxhdmVuZGVsCQkgICAgIzhENUI5QSAoMTQxLDkxLDE1NCkJCQkJICAgICAgPT4JMTAJCQojIyMJMTEJYmx1ZXB1cnBsZQkJICAjNzA1Mjk2ICgxMTIsODIsMTUwKQkJCQkgICAgICA9PgkxMQkJCiMjIwkxMglwdXJwbGVibHVlCQkgICM2ODZBQTkgKDEwNCwxMDYsMTY5KQkJCSAgICAgID0+CTEyCQkKIyMjCTEzCWxpZ2h0cHVycGxlYmx1ZQkjNjE3M0FEICg5NywxMTUsMTczLzEwMSwxMjAsMTgwKQk9PgkxMwkJCiMjIwkxNAlzZWFibHVlCQkJICAgICM0QzgxQkYgKDc2LDEyOSwxOTEpCQkJCSAgICAgID0+CTE0CQkKIyMjCTE1CXNreWJsdWUJCQkgICAgIzJGOEJDOSAoNDcsMTM5LDIwMSkJCQkJICAgICAgPT4JMTUJCQojIyMJMTYJYXp1cmJsdWUJCSAgICAjMTI5MEQ5ICgxOCwxNDQsMjE3KQkJCQkgICAgICA9PgkxNgkJb3IgMC4wMTxNQUY8MC4wNSBvciAwLjI8SU5GTzwwLjQKIyMjCTE3CWxpZ2h0YXp1cmJsdWUJICAjMTM5NkQ4ICgxOSwxNTAsMjE2KQkJCQkgICAgICA9PgkxNwkJCiMjIwkxOAlncmVlbmJsdWUJCSAgICAjMTVBNkMxICgyMSwxNjYsMTkzKQkJCQkgICAgICA9PgkxOAkJCiMjIwkxOQlzZWF3ZWVkZ3JlZW4JICAjNUVCMTdGICg5NCwxNzcsMTI3KQkJCQkgICAgICA9PgkxOQkJCiMjIwkyMAl5ZWxsb3dncmVlbgkJICAjODZCODMzICgxMzQsMTg0LDUxKQkJCQkgICAgICA9PgkyMAkJCiMjIwkyMQlsaWdodG1vc3NncmVlbgkjQzVEMjIwICgxOTcsMjEwLDMyKQkJCQkgICAgICA9PgkyMQkJCiMjIwkyMgltb3NzZ3JlZW4JCSAgICAjOUZDMjI4ICgxNTksMTk0LDQwKQkJCQkgICAgICA9PgkyMgkJb3IgTUFGPjAuMjAgb3IgMC42PElORk88MC44CiMjIwkyMwlsaWdodGdyZWVuCSAgCSM3OEIxMTMgKDEyMCwxNzcsMTkpCQkJCSAgICAgID0+CTIzL1gKIyMjCTI0CWdyZWVuCQkJICAgICAgIzQ5QTAxRCAoNzMsMTYwLDI5KQkJCQkgICAgICA9PgkyNC9ZCiMjIwkyNQlncmV5CQkJICAgICAgIzU5NUE1QyAoODksOTAsOTIpCQkJCSAgICAgICAgPT4JMjUvWFkJb3IgTUFGPDAuMDEgb3IgMC4wPElORk88MC4yCiMjIwkyNglsaWdodGdyZXkJCSAgICAjQTJBM0E0CSgxNjIsMTYzLDE2NCkJCQkgICAgICA9PgkyNi9NVAojIyMKIyMjCUFERElUSU9OQUwgQ09MT1JTCiMjIwkyNwltaWRncmV5CQkJI0Q3RDhENwojIyMJMjgJdmVyeWxpZ2h0Z3JleQkjRUNFQ0VDIgojIyMJMjkJd2hpdGUJCQkjRkZGRkZGCiMjIwkzMAlibGFjawkJCSMwMDAwMDAKIyMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdWl0aG9mX2NvbG9yID0gYygiI0ZCQjgyMCIsIiNGNTlEMTAiLCIjRTU1NzM4IiwiI0RCMDAzRiIsIiNFMzU0OTMiLCIjRDUyNjdCIiwKICAgICAgICAgICAgICAgICAiI0NDMDA3MSIsIiNBODQ0OEEiLCIjOUEzNDgwIiwiIzhENUI5QSIsIiM3MDUyOTYiLCIjNjg2QUE5IiwKICAgICAgICAgICAgICAgICAiIzYxNzNBRCIsIiM0QzgxQkYiLCIjMkY4QkM5IiwiIzEyOTBEOSIsIiMxMzk2RDgiLCIjMTVBNkMxIiwKICAgICAgICAgICAgICAgICAiIzVFQjE3RiIsIiM4NkI4MzMiLCIjQzVEMjIwIiwiIzlGQzIyOCIsIiM3OEIxMTMiLCIjNDlBMDFEIiwKICAgICAgICAgICAgICAgICAiIzU5NUE1QyIsIiNBMkEzQTQiLCAiI0Q3RDhENyIsICIjRUNFQ0VDIiwgIiNGRkZGRkYiLCAiIzAwMDAwMCIpCgp1aXRob2ZfY29sb3JfbGVnZW5kID0gYygiI0ZCQjgyMCIsICIjRjU5RDEwIiwgIiNFNTU3MzgiLCAiI0RCMDAzRiIsICIjRTM1NDkzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIiNENTI2N0IiLCAiI0NDMDA3MSIsICIjQTg0NDhBIiwgIiM5QTM0ODAiLCAiIzhENUI5QSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIjNzA1Mjk2IiwgIiM2ODZBQTkiLCAiIzYxNzNBRCIsICIjNEM4MUJGIiwgIiMyRjhCQzkiLAogICAgICAgICAgICAgICAgICAgICAgICAiIzEyOTBEOSIsICIjMTM5NkQ4IiwgIiMxNUE2QzEiLCAiIzVFQjE3RiIsICIjODZCODMzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIiNDNUQyMjAiLCAiIzlGQzIyOCIsICIjNzhCMTEzIiwgIiM0OUEwMUQiLCAiIzU5NUE1QyIsCiAgICAgICAgICAgICAgICAgICAgICAgICIjQTJBM0E0IiwgIiNEN0Q4RDciLCAiI0VDRUNFQyIsICIjRkZGRkZGIiwgIiMwMDAwMDAiKQoKI2dncGxvdDIgZGVmYXVsdCBjb2xvciBwYWxldHRlCmdnX2NvbG9yX2h1ZSA8LSBmdW5jdGlvbihuKSB7CiAgaHVlcyA9IHNlcSgxNSwgMzc1LCBsZW5ndGggPSBuICsgMSkKICBoY2woaCA9IGh1ZXMsIGwgPSA2NSwgYyA9IDEwMClbMTpuXQp9CgojIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgYGAKCiMgRVJBLUNWRCAnZHJ1Z2dhYmxlLU1JLXRhcmdldHMnCjwhLS0gIVtFUkEtQ1ZEIGxvZ29dKCJVc2Vycy9zd3ZhbmRlcmxhYW4vaUNsb3VkL0dlbm9taWNzL1Byb2plY3RzLyNEcnVnZ2FibGUtTUktR2VuZXMvQWRtaW5pc3RyYXRpb24vRVJBLUNWRFwgTG9nb19DTVlLLmpwZyIpIC0tPgoKRm9yIHRoZSBFUkEtQ1ZEICdkcnVnZ2FibGUtTUktdGFyZ2V0cycgcHJvamVjdCAoZ3JhbnRudW1iZXI6IDAxS0wxODAyKSB3ZSB3aWxsIHBlcmZvcm0gdHdvIHJlbGF0ZWQgUk5BIHNlcXVlbmNpbmcgKFJOQXNlcSkgZXhwZXJpbWVudHM6CgoxKSBjb252ZW50aW9uYWwgKCdidWxrJykgUk5Bc2VxIHVzaW5nIFJOQSBleHRyYWN0ZWQgZnJvbSBjYXJvdGlkIHBsYXF1ZSBzYW1wbGVzLCBuIMKxIDcwMC4gQXMgb2YgYHIgVG9kYXkuUmVwb3J0YCBhbGwgc2FtcGxlcyBoYXZlIGJlZW4gc2VsZWN0ZWQgYW5kIFJOQSBoYXMgYmVlbiBleHRyYWN0ZWQ7IHF1YWxpdHkgY29udHJvbCAoUUMpIHdhcyBwZXJmb3JtZWQgYW5kIHdlIGhhdmUgYSBkYXRhc2V0IG9mIDYzNSBzYW1wbGVzLgoKMikgc2luZ2xlLWNlbGwgUk5Bc2VxIChzY1JOQXNlcSkgb2YgYXQgbGVhc3QgbiA9IDQwIHNhbXBsZXMgKDIwIGZlbWFsZXMsIDIwIG1hbGVzKS4gQXMgb2YgYHIgVG9kYXkuUmVwb3J0YCBkYXRhIGlzIGF2YWlsYWJsZSBvZiA0MCBzYW1wbGVzICgzIGZlbWFsZXMsIDE1IG1hbGVzKSwgd2UgYXJlIGV4dGVuZGluZyBzYW1wbGluZyB0byBnZXQgbW9yZSBmZW1hbGUgc2FtcGxlcy4KClBsYXF1ZSBzYW1wbGVzIGFyZSBkZXJpdmVkIGZyb20gY2Fyb3RpZCBlbmRhcnRlcmVjdG9taWVzIGFzIHBhcnQgb2YgdGhlIFtBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5XShodHRwOnd3dy9hdGhlcm9leHByZXNzLm5sKSB3aGljaCBpcyBhbiBvbmdvaW5nIHN0dWR5IGluIHRoZSBVTUMgVXRyZWNodC4KCgojIEJhY2tncm91bmQKCkhlcmUgd2UgbWFwIHRoZSBDSEFSR0UgQ29uc29ydGl1bSAxMDAwRyBHV0FTIG9uIF9jb3JvbmFyeSBhcnRlcnkgY2FsY2lmaWNhdGlvbiAoQ0FDKV8gc3VzY2VwdGliaWxpdHkgbG9jaSB0byB0aGUgc2luZ2xlLWNlbGwgY2Fyb3RpZCBwbGFxdWUgZGF0YS4gVGhlc2UgYXJlIGdpdmVuIGluOgoKLSBgSW5kU2lnU05Qc2ZvclNhbmRlci54bHN4YAotIGBHZW5lTGlzdF8xNTA0MjAyMC54bHN4YAoKYGBge3IgQ0FDIHRhcmdldHN9CmxpYnJhcnkob3Blbnhsc3gpCgpDQUNfZ2VuZV9saXN0IDwtIHJlYWQueGxzeChwYXN0ZTAoUFJPSkVDVF9sb2MsICIvU05QL0dlbmVzLnhsc3giKSkKCkNBQ192YXJpYW50cyA8LSByZWFkLnhsc3gocGFzdGUwKFBST0pFQ1RfbG9jLCAiL1NOUC9WYXJpYW50cy54bHN4IikpCgoKRFQ6OmRhdGF0YWJsZShDQUNfZ2VuZV9saXN0KQoKRFQ6OmRhdGF0YWJsZShDQUNfdmFyaWFudHMpCgpgYGAKCldlIHdpbGwgY29uc3RydWN0IGEgbGlzdCBvZiBnZW5lcyB0byBtYXAgdG8gb3VyIHNjUk5Bc2VxIGRhdGEuIAoKYGBge3IgQ0FDIHRhcmdldHMgZm9yIG1hcHBpbmd9Cgp0YXJnZXRfZ2VuZXMgPC0gdW5saXN0KENBQ19nZW5lX2xpc3QkR2VuZSkKdGFyZ2V0X2dlbmVzCmBgYAoKCiMgTG9hZCBkYXRhCkZpcnN0IHdlIHdpbGwgbG9hZCB0aGUgZGF0YToKCi0gc2NSTkFzZXEgZXhwZXJpbWVudGFsIGRhdGEgYW5kIHJlbmFtZSB0aGUgY2VsbCB0eXBlcy4KLSBBdGhlcm8tRXhwcmVzcyBjbGluaWNhbCBkYXRhLgoKIyMgQUVTQ1JOQTogc2luZ2xlLWNlbGwgUk5Bc2VxIGZyb20gY2Fyb3RpZCBwbGFxdWVzCgpIZXJlIHdlIGxvYWQgdGhlIGxhdGVzdCBkYXRhc2V0IGZyb20gb3VyIEF0aGVyby1FeHByZXNzIFNpbmdsZSBDZWxsIFJOQSBleHBlcmltZW50LgoKYGBge3IgTG9hZERhdGF9CgpzY1JOQXNlcURhdGEgPC0gcmVhZFJEUyhwYXN0ZTAoUkFXREFUQSwgIi9TZXVzZXRfNDBfcGF0aWVudHMvMjAyMTAyMTdfUGxhcVZpZXdfMzhfcHRzLlJEUyIpKQpzY1JOQXNlcURhdGEKCmBgYAoKVGhlIG5hbWluZy9jbGFzc2lmaWNhdGlvbiBpcyBiYXNlZCBvbiBhIGNvbWJpbmF0aW9uIGNvbnZlbnRpb25hbCBtYXJrZXJzLiBXZSBkbyBub3QgY2xhaW0gdG8ga25vdyB0aGUgZXhhY3QgaWRlbnRpdHkgb2YgZWFjaCBjZWxsLCByYXRoZXIgd2UgcmVmZXIgdG8gY2VsbHMgYXMgJ0tJVCsgTWFzdCBjZWxscyItbGlrZSBjZWxscy4gTGlrZXdpc2Ugd2UgcmVmZXIgdG8gdGhlIGNlbGwgY2x1c3RlcnMgYXMgJ2NvbW11bml0aWVzJyBvZiBjZWxscyB0aGF0IGV4aWhpYml0IHNpbWlsYXIgcHJvcGVydGllcywgX2kuZS5fIHNpbWlsYXIgZGVmaW5pbmcgbWFya2VycyAoX2UuZy4gS0lUXykuIAoKV2Ugd2lsbCByZW5hbWUgdGhlIGNlbGwgdHlwZXMgdG8gaHVtYW4gcmVhZGFibGUgbmFtZXMuIApgYGB7ciBDaGFuZ2UgY2VsbCBjdW1tdW5pdHkgbmFtZXN9CiMjIyBjaGFuZ2UgbmFtZXMgZm9yIGNsYXJpdHkKYmFja3VwLnNjUk5Bc2VxRGF0YSA9IHNjUk5Bc2VxRGF0YQojIGdldCB0aGUgb2xkIG5hbWVzIHRvIGNoYW5nZSB0byBuZXcgbmFtZXMKVU1BUFBsb3QoYmFja3VwLnNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBGQUxTRSwgcHQuc2l6ZSA9IDEuMjUsIGxhYmVsLnNpemUgPSA0LCBncm91cC5ieSA9ICJpZGVudCIpCgpsZXZlbHModW5pcXVlKGJhY2t1cC5zY1JOQXNlcURhdGFAYWN0aXZlLmlkZW50KSkKCiMgIkNEMytDRDhBKyBUIGNlbGxzIEkiICAgICAgICAgIkNEMytDRDhBKyBUIGNlbGxzIElJSSIgICAgICAgIkNEMytDRDQrIFQgQ2VsbHMgSSIgICAgICAgICAgIkNEMTQrQ0Q2OCsgTWFjcm9waGFnZXMgSSIgICAKIyAiTWl4ZWQgQ2VsbHMgSSIgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgQ2VsbHMgSUkiICAgICAgICAiQ0QxNCtDRDY4KyBNYWNyb3BoYWdlcyBJSSIgICAiQ0QzK0NENCsgVCBDZWxscyBJSSIgICAgICAgIAojICJBQ1RBMisgU21vb3RoIE11c2NsZSBDZWxscyIgICJDRDM0KyBFbmRvdGhlbGlhbCBDZWxscyBJIiAgICJDRDM0KyBFbmRvdGhlbGlhbCBDZWxscyBJSSIgICJOQ0FNMSsgTmF0dXJhbCBLaWxsZXIgQ2VsbHMiCiMgIk1peGVkIENlbGxzIElJIiAgICAgICAgICAgICAgIkNENzlBKyBCIENlbGxzIEkiICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTWFjcm9waGFnZXMgSUlJIiAgIkNEMysgUmVndWxhdG9yeSBUIENlbGxzIiAgICAKIyAiS0lUKyBNYXN0IENlbGxzIiAgICAgICAgICAgICAiQ0Q3OUErIEIgQ2VsbHMgSUkiIAoKY2VsbHR5cGVzIDwtIGMoIkNEMTQrQ0Q2OCsgTWFjcm9waGFnZXMgSSIgPSAiQ0QxNCtDRDY4KyBNIEkiLCAKICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTWFjcm9waGFnZXMgSUkiID0gIkNEMTQrQ0Q2OCsgTSBJSSIsIAogICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNYWNyb3BoYWdlcyBJSUkiID0gIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgY2VsbHMgSSIgPSAiQ0QzK0NEOEErIFQgSSIsCiAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBDZWxscyBJSSIgPSAiQ0QzK0NEOEErIFQgSUkgIiwgCiAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBjZWxscyBJSUkiID0gIkNEMytDRDhBKyBUIElJSSIsIAogICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBDZWxscyBJIiA9ICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgQ2VsbHMgSUkiID0gIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgIkNEMysgUmVndWxhdG9yeSBUIENlbGxzIiA9ICJDRDMrIFRyZWciLCAKICAgICAgICAgICAgICAgIkNEMzQrIEVuZG90aGVsaWFsIENlbGxzIEkiID0gIkNEMzQrIEVDIEkiLCAKICAgICAgICAgICAgICAgIkNEMzQrIEVuZG90aGVsaWFsIENlbGxzIElJIiA9ICJDRDM0KyBFQyBJSSIsIAogICAgICAgICAgICAgICAiTWl4ZWQgQ2VsbHMgSSIgPSAiTWl4ZWQgSSIsIAogICAgICAgICAgICAgICAiTWl4ZWQgQ2VsbHMgSUkiID0gIk1peGVkIElJIiwgCiAgICAgICAgICAgICAgICJBQ1RBMisgU21vb3RoIE11c2NsZSBDZWxscyIgPSAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAiTkNBTTErIE5hdHVyYWwgS2lsbGVyIENlbGxzIiA9ICJOQ0FNMSsgTksiLCAKICAgICAgICAgICAgICAgIktJVCsgTWFzdCBDZWxscyIgPSAiS0lUKyBNQyIsCiAgICAgICAgICAgICAgICJDRDc5QSsgQiBDZWxscyBJIiA9ICJDRDc5QSsgQiBJIiwgCiAgICAgICAgICAgICAgICJDRDc5QSsgQiBDZWxscyBJSSIgPSAiQ0Q3OUErIEIgSUkiKQoKc2NSTkFzZXFEYXRhIDwtIFNldXJhdDo6UmVuYW1lSWRlbnRzKG9iamVjdCA9IGJhY2t1cC5zY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsdHlwZXMpClVNQVBQbG90KHNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBGQUxTRSwgcHQuc2l6ZSA9IDEuMjUsIGxhYmVsLnNpemUgPSA0LCBncm91cC5ieSA9ICJpZGVudCIpCmBgYAoKYGBge3IgQ2hhbmdlIGNlbGwgY3VtbXVuaXR5IG5hbWVzIC0gbmV3IHBsb3R9ClVNQVBQbG90KHNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMS4yNSwgbGFiZWwuc2l6ZSA9IDQsIGdyb3VwLmJ5ID0gImlkZW50IiwKICAgICAgICAgcmVwZWwgPSBUUlVFKQoKYGBgCgojIyBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5OiBjbGluaWNhbCBkYXRhCgpMb2FkaW5nIEF0aGVyby1FeHByZXNzIGNsaW5pY2FsIGRhdGEuCmBgYHtyIExvYWRBRURCfQpyZXF1aXJlKGhhdmVuKQoKIyBBRURCIDwtIGhhdmVuOjpyZWFkX3NhdihwYXN0ZTAoQUVEQl9sb2MsICIvMjAxOS0zTkVXX0F0aGVyb0V4cHJlc3NEYXRhYmFzZV9TY2llbnRpZmljQUVfMDIwNzIwMTlfSUNfYWRkZWQuc2F2IikpCkFFREIgPC0gaGF2ZW46OnJlYWRfc2F2KHBhc3RlMChBRURCX2xvYywgIi8yMDIwXzFfTkVXX0F0aGVyb0V4cHJlc3NEYXRhYmFzZV9TY2llbnRpZmljQUVfMTYtMDMtMjAyMC5zYXYiKSkKCmBgYAoKIyMjIEZpeCBjbGluaWNhbCBkYXRhCgpXZSBuZWVkIHRvIGJlIHZlcnkgc3RyaWN0IGluIGRlZmluaW5nIF9zeW1wdG9tcy5fIFRoZXJlZm9yZSB3ZSB3aWxsIGZpeCBhIG5ldyB2YXJpYWJsZSB0aGF0IGdyb3VwcyBfc3ltcHRvbXNfIGF0IGluY2x1c2lvbi4KCkNvZGluZyBvZiBfc3ltcHRvbXNfIGlzIGFzIGZvbGxvd3M6CgotIG1pc3NpbmcJLTk5OQkKLSBBc3ltcHRvbWF0aWMJMAkKLSBUSUEJMQkKLSBtaW5vciBzdHJva2UJMgkKLSBNYWpvciBzdHJva2UJMwkKLSBBbWF1cm9zaXMgZnVnYXgJNAkKLSBGb3VyIHZlc3NlbCBkaXNlYXNlCTUJCi0gVmVydGVicm9iYXNpbGFyeSBUSUEJNwkKLSBSZXRpbmFsIGluZmFyY3Rpb24JOAkKLSBTeW1wdG9tYXRpYywgYnV0IGFzcGVjaWZpYyBzeW10b21zCTkKLSBDb250cmFsYXRlcmFsIHN5bXB0b21hdGljIG9jY2x1c2lvbgkxMAkKLSByZXRpbmFsIGluZmFyY3Rpb24JMTEJCi0gYXJtY2xhdWRpY2F0aW9uIGR1ZSB0byBvY2NsdXNpb24gc3ViY2xhdmlhbiBhcnRlcnksIENFQSBuZWVkZWQgZm9yIGJ5cGFzcwkxMgkKLSByZXRpbmFsIGluZmFyY3Rpb24gKyBUSUFzCTEzCQotIE9jdWxhciBpc2NoZW1pYyBzeW5kcm9tZQkxNAkKLSBpc2NoZW1pc2NoIGdsYXVjb29tCTE1CQotIHN1YmNsYXZpYW4gc3RlYWwgc3luZHJvbWUJMTYJCi0gVEdBCTE3CgpXZSB3aWxsIGdyb3VwIGFzIGZvbGxvd3M6CgoxLiBBc3ltcHRvbWF0aWMgPiAwCjIuIFRJQSA+IDEsIDcsIDEzCjMuIFN0cm9rZSA+IDIsIDMKNC4gT2N1bGFyID4gNCwgMTQsIDE1CjUuIFJldGluYWwgaW5mYXJjdGlvbiA+IDgsIDExCjYuIE90aGVyID4gNSwgOSwgMTAsIDEyLCAxNiwgMTcKCgpgYGB7ciBGaXhTeW1wdG9tcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgRml4IHN5bXB0b21zCgphdHRhY2goQUVEQikKQUVEQlssIlN5bXB0b21zLjVHIl0gPC0gTkEKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSAwXSA8LSAiQXN5bXB0b21hdGljIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDEgfCBzeW1wdCA9PSA3IHwgc3ltcHQgPT0gMTNdIDwtICJUSUEiCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gMiB8IHN5bXB0ID09IDNdIDwtICJTdHJva2UiCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gNCB8IHN5bXB0ID09IDE0IHwgc3ltcHQgPT0gMTUgXSA8LSAiT2N1bGFyIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDggfCBzeW1wdCA9PSAxMV0gPC0gIlJldGluYWwgaW5mYXJjdGlvbiIKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSA1IHwgc3ltcHQgPT0gOSB8IHN5bXB0ID09IDEwIHwgc3ltcHQgPT0gMTIgfCBzeW1wdCA9PSAxNiB8IHN5bXB0ID09IDE3XSA8LSAiT3RoZXIiCgoKIyBBc3ltcHRTeW1wdApBRURCWywiQXN5bXB0U3ltcHQiXSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0W3N5bXB0ID09IC05OTldIDwtIE5BCkFFREIkQXN5bXB0U3ltcHRbc3ltcHQgPT0gMF0gPC0gIkFzeW1wdG9tYXRpYyIKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzIHwgc3ltcHQgPT0gMiB8IHN5bXB0ID09IDNdIDwtICJTeW1wdG9tYXRpYyIKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSA0IHwgc3ltcHQgPT0gMTQgfCBzeW1wdCA9PSAxNSB8IHN5bXB0ID09IDggfCBzeW1wdCA9PSAxMSB8IHN5bXB0ID09IDUgfCBzeW1wdCA9PSA5IHwgc3ltcHQgPT0gMTAgfCBzeW1wdCA9PSAxMiB8IHN5bXB0ID09IDE2IHwgc3ltcHQgPT0gMTddIDwtICJPY3VsYXIgYW5kIG90aGVycyIKCiMgQXN5bXB0U3ltcHQKQUVEQlssIkFzeW1wdFN5bXB0MkciXSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0Mkdbc3ltcHQgPT0gLTk5OV0gPC0gTkEKQUVEQiRBc3ltcHRTeW1wdDJHW3N5bXB0ID09IDBdIDwtICJBc3ltcHRvbWF0aWMiCkFFREIkQXN5bXB0U3ltcHQyR1tzeW1wdCA9PSAxIHwgc3ltcHQgPT0gNyB8IHN5bXB0ID09IDEzIHwgc3ltcHQgPT0gMiB8IHN5bXB0ID09IDMgfCBzeW1wdCA9PSA0IHwgc3ltcHQgPT0gMTQgfCBzeW1wdCA9PSAxNSB8IHN5bXB0ID09IDggfCBzeW1wdCA9PSAxMSB8IHN5bXB0ID09IDUgfCBzeW1wdCA9PSA5IHwgc3ltcHQgPT0gMTAgfCBzeW1wdCA9PSAxMiB8IHN5bXB0ID09IDE2IHwgc3ltcHQgPT0gMTddIDwtICJTeW1wdG9tYXRpYyIKCmRldGFjaChBRURCKQoKIyB0YWJsZShBRURCJHN5bXB0LCB1c2VOQSA9ICJpZmFueSIpCiMgdGFibGUoQUVEQiRBc3ltcHRTeW1wdDJHLCB1c2VOQSA9ICJpZmFueSIpCiMgdGFibGUoQUVEQiRTeW1wdG9tcy41RywgdXNlTkEgPSAiaWZhbnkiKQojIAojIHRhYmxlKEFFREIkQXN5bXB0U3ltcHQyRywgQUVEQiRzeW1wdCwgdXNlTkEgPSAiaWZhbnkiKQojIHRhYmxlKEFFREIkU3ltcHRvbXMuNUcsIEFFREIkc3ltcHQsIHVzZU5BID0gImlmYW55IikKdGFibGUoQUVEQiRBc3ltcHRTeW1wdDJHLCBBRURCJFN5bXB0b21zLjVHLCB1c2VOQSA9ICJpZmFueSIpCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAic3ltcHQiLCAiU3ltcHRvbXMuNUciLCAiQXN5bXB0U3ltcHQiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyB0YWJsZShBRURCLnRlbXAkU3ltcHRvbXMuNUcsIEFFREIudGVtcCRBc3ltcHRTeW1wdCkKIyAKIyBybShBRURCLnRlbXApCmBgYAoKV2Ugd2lsbCBhbHNvIGZpeCB0aGUgX3BsYXF1ZXBoZW5vdHlwZXNfIHZhcmlhYmxlLiAgCgpDb2Rpbmcgb2Ygc3ltcHRvbXMgaXMgYXMgZm9sbG93czoKCi0gbWlzc2luZwktOTk5CQotIG5vdCByZWxldmFudCAtODg4Ci0gZmlicm91cwkxCQotIGZpYnJvYXRoZXJvbWF0b3VzCTIJCi0gYXRoZXJvbWF0b3VzCTMJCgoKYGBge3IgRml4UGxhcXVlUGhlbm90eXBlcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgRml4IHBsYXF1ZXBoZW5vdHlwZXMKYXR0YWNoKEFFREIpCkFFREJbLCJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIl0gPC0gTkEKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlW3BsYXF1ZXBoZW5vdHlwZSA9PSAtOTk5XSA8LSBOQQpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IC05OTldIDwtIE5BCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gMV0gPC0gImZpYnJvdXMiCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gMl0gPC0gImZpYnJvYXRoZXJvbWF0b3VzIgpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IDNdIDwtICJhdGhlcm9tYXRvdXMiCmRldGFjaChBRURCKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgInBsYXF1ZXBoZW5vdHlwZSIsICJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKYGBgCgpXZSB3aWxsIGFsc28gZml4IHRoZSBfZGlhYmV0ZXNfIHN0YXR1cyB2YXJpYWJsZS4KCmBgYHtyIEZpeERpYWJldGVzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBGaXggZGlhYmV0ZXMKYXR0YWNoKEFFREIpCkFFREJbLCJEaWFiZXRlc1N0YXR1cyJdIDwtIE5BCkFFREIkRGlhYmV0ZXNTdGF0dXNbRE0uY29tcG9zaXRlID09IC05OTldIDwtIE5BCkFFREIkRGlhYmV0ZXNTdGF0dXNbRE0uY29tcG9zaXRlID09IDBdIDwtICJDb250cm9sIChubyBEaWFiZXRlcyBEeC9NZWQpIgpBRURCJERpYWJldGVzU3RhdHVzW0RNLmNvbXBvc2l0ZSA9PSAxXSA8LSAiRGlhYmV0ZXMiCmRldGFjaChBRURCKQoKdGFibGUoQUVEQiRETS5jb21wb3NpdGUsIEFFREIkRGlhYmV0ZXNTdGF0dXMpCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJETS5jb21wb3NpdGUiLCAiRGlhYmV0ZXNTdGF0dXMiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkRGlhYmV0ZXNTdGF0dXMpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgpgYGAKCgpXZSB3aWxsIGFsc28gZml4IHRoZSBfc21va2luZ18gc3RhdHVzIHZhcmlhYmxlLiBXZSBhcmUgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHNvbWVvbmUgbmV2ZXIsIGV2ZXIgb3IgaXMgY3VycmVudGx5IChhdCB0aGUgdGltZSBvZiBpbmNsdXNpb24pIHNtb2tpbmcuIFRoaXMgaXMgYmFzZWQgb24gdGhlIHF1ZXN0aW9ubmFpcmUuIAoKLSBgZGlldDgwMWA6IGFyZSB5b3UgYSBzbW9rZXI/Ci0gYGRpZXQ4MDJgOiBkaWQgeW91IHNtb2tlIGluIHRoZSBwYXN0PwoKV2UgYWxyZWFkeSBoYXZlIHNvbWUgdmFyaWFibGVzIGluZGljYXRpbmcgc21va2luZyBzdGF0dXM6CgotIGBTbW9raW5nUmVwb3J0ZWRgOiBwYXRpZW50IGhhcyByZXBvcnRlZCB0byBzbW9rZS4KLSBgU21va2luZ1llYXJPUmA6IHNtb2tpbmcgaW4gdGhlIHllYXIgb2Ygc3VyZ2VyeT8KLSBgU21va2VyQ3VycmVudGA6IGN1cnJlbnRseSBzbW9raW5nPwoKCgpgYGB7ciBGaXhTbW9raW5nLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpyZXF1aXJlKGxhYmVsbGVkKQpBRURCJGRpZXQ4MDEgPC0gdG9fZmFjdG9yKEFFREIkZGlldDgwMSkKQUVEQiRkaWV0ODAyIDwtIHRvX2ZhY3RvcihBRURCJGRpZXQ4MDIpCkFFREIkZGlldDgwNSA8LSB0b19mYWN0b3IoQUVEQiRkaWV0ODA1KQpBRURCJFNtb2tpbmdSZXBvcnRlZCA8LSB0b19mYWN0b3IoQUVEQiRTbW9raW5nUmVwb3J0ZWQpCkFFREIkU21va2VyQ3VycmVudCA8LSB0b19mYWN0b3IoQUVEQiRTbW9rZXJDdXJyZW50KQpBRURCJFNtb2tpbmdZZWFyT1IgPC0gdG9fZmFjdG9yKEFFREIkU21va2luZ1llYXJPUikKCiMgdGFibGUoQUVEQiRkaWV0ODAxKQojIHRhYmxlKEFFREIkZGlldDgwMikKIyB0YWJsZShBRURCJFNtb2tpbmdSZXBvcnRlZCkKIyB0YWJsZShBRURCJFNtb2tlckN1cnJlbnQpCiMgdGFibGUoQUVEQiRTbW9raW5nWWVhck9SKQojIHRhYmxlKEFFREIkU21va2luZ1JlcG9ydGVkLCBBRURCJFNtb2tlckN1cnJlbnQsIHVzZU5BID0gImlmYW55IiwgZG5uID0gYygiUmVwb3J0ZWQgc21va2luZyIsICJDdXJyZW50IHNtb2tlciIpKQojIAojIHRhYmxlKEFFREIkZGlldDgwMSwgQUVEQiRkaWV0ODAyLCB1c2VOQSA9ICJpZmFueSIsIGRubiA9IGMoIlNtb2tlciIsICJQYXN0IHNtb2tlciIpKQoKY2F0KCJcbkZpeGluZyBzbW9raW5nIHN0YXR1cy5cbiIpCmF0dGFjaChBRURCKQpBRURCWywiU21va2VyU3RhdHVzIl0gPC0gTkEKQUVEQiRTbW9rZXJTdGF0dXNbZGlldDgwMiA9PSAiZG9uJ3Qga25vdyJdIDwtICJOZXZlciBzbW9rZWQiCkFFREIkU21va2VyU3RhdHVzW2RpZXQ4MDIgPT0gIkkgc3RpbGwgc21va2UiXSA8LSAiQ3VycmVudCBzbW9rZXIiCkFFREIkU21va2VyU3RhdHVzW1Ntb2tlckN1cnJlbnQgPT0gIm5vIiAmIGRpZXQ4MDIgPT0gIm5vIl0gPC0gIk5ldmVyIHNtb2tlZCIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAibm8iICYgZGlldDgwMiA9PSAieWVzIl0gPC0gIkV4LXNtb2tlciIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAieWVzIl0gPC0gIkN1cnJlbnQgc21va2VyIgpBRURCJFNtb2tlclN0YXR1c1tTbW9rZXJDdXJyZW50ID09ICJubyBkYXRhIGF2YWlsYWJsZS9taXNzaW5nIl0gPC0gTkEKIyBBRURCJFNtb2tlclN0YXR1c1tpcy5uYShTbW9rZXJDdXJyZW50KV0gPC0gIk5ldmVyIHNtb2tlZCIKZGV0YWNoKEFFREIpCgpjYXQoIlxuKiBDdXJyZW50IHNtb2tpbmcgc3RhdHVzLlxuIikKdGFibGUoQUVEQiRTbW9rZXJDdXJyZW50LAogICAgICB1c2VOQSA9ICJpZmFueSIsIAogICAgICBkbm4gPSBjKCJDdXJyZW50IHNtb2tlciIpKQoKY2F0KCJcbiogVXBkYXRlZCBzbW9raW5nIHN0YXR1cy5cbiIpCnRhYmxlKEFFREIkU21va2VyU3RhdHVzLAogICAgICB1c2VOQSA9ICJpZmFueSIsIAogICAgICBkbm4gPSBjKCJVcGRhdGVkIHNtb2tpbmcgc3RhdHVzIikpCgpjYXQoIlxuKiBDb21wYXJpbmcgdG8gJ1Ntb2tlckN1cnJlbnQnLlxuIikKdGFibGUoQUVEQiRTbW9rZXJTdGF0dXMsIEFFREIkU21va2VyQ3VycmVudCwgCiAgICAgIHVzZU5BID0gImlmYW55IiwgCiAgICAgIGRubiA9IGMoIlVwZGF0ZWQgc21va2luZyBzdGF0dXMiLCAiQ3VycmVudCBzbW9rZXIiKSkKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJETS5jb21wb3NpdGUiLCAiRGlhYmV0ZXNTdGF0dXMiKSkKIyByZXF1aXJlKGxhYmVsbGVkKQojIEFFREIudGVtcCRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRHZW5kZXIpCiMgQUVEQi50ZW1wJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkSG9zcGl0YWwpCiMgQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkpCiMgQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkRGlhYmV0ZXNTdGF0dXMpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgoKYGBgCgpXZSB3aWxsIGFsc28gZml4IHRoZSBfYWxjb2hvbF8gc3RhdHVzIHZhcmlhYmxlLgoKCmBgYHtyIEZpeEFsY29ob2wsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIEZpeCBkaWFiZXRlcwphdHRhY2goQUVEQikKQUVEQlssIkFsY29ob2xVc2UiXSA8LSBOQQpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAtOTk5XSA8LSBOQQpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAwXSA8LSAiTm8iCkFFREIkQWxjb2hvbFVzZVtkaWV0ODEwID09IDFdIDwtICJZZXMiCmRldGFjaChBRURCKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgImRpZXQ4MTAiLCAiQWxjb2hvbFVzZSIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyBBRURCLnRlbXAkQWxjb2hvbFVzZSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFsY29ob2xVc2UpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgoKYGBgCgoKIyMjIFByZXBhcmUgYmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzCgpXZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhdCBiYXNlbGluZS4KCi0gQWdlICh5ZWFycykKLSBGZW1hbGUgc2V4IChOLCAlKQotIEh5cGVydGVuc2lvbiAoTiwgJSkKLSBTQlAgKG1tSGcpCi0gREJQIChtbUhnKQotIERpYWJldGVzIG1lbGxpdHVzIChOLCAlKQotIFRvdGFsIGNob2xlc3Rlcm9sIGxldmVscyAobWcvZEwpCi0gTERMIGNob2xlc3Rlcm9sIGxldmVscyAobWcvZEwpCi0gSERMIGNob2xlc3Rlcm9sIGxldmVscyAobWcvZEwpCi0gVHJpZ2x5Y2VyaWRlIGxldmVscyAobWcvZEwpCi0gVXNlIG9mIHN0YXRpbnMgKE4sICUpCi0gVXNlIG9mIGFudGlwbGF0ZWxldCBkcnVncyAoTiwgJSkKLSBCTUkgKGtnL23CsikKLSBTbW9raW5nIHN0YXR1cyAoTiwgJSkKICAtIE5ldmVyIHNtb2tlcnMKICAtIEV4LXNtb2tlcnMKICAtIEN1cnJlbnQgc21va2VycwotIEhpc3Rvcnkgb2YgQ0FEIChOLCAlKQotIEhpc3Rvcnkgb2YgUEFEIChOLCAlKQotIENsaW5pY2FsIG1hbmlmZXN0YXRpb25zCiAgLSBBc3ltcHRvbWF0aWMKICAtIEFtYXVyb3NpcyBmdWdheAogIC0gVElBCiAgLSBTdHJva2UKLSBlR0ZSIChtTC9taW4vMS43MyBtwrIpCi0gVGVzdG9zdGVyb25lIChubW9sL0wpCgpgYGB7ciBCYXNlbGluZSBBRURCOiBwcmVwYXJhdGlvbn0KY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQpjYXQoIlNFTEVDVElPTiBUSEUgU0hJWlpMRVxuIikKCiMjIyBBcnRlcnkgbGV2ZWxzCiMgQUVkYXRhJEFydGVyeV9zdW1tYXJ5OiAKIyAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsCiMgTk9UIFVTRSAtIDAgTm8gYXJ0ZXJ5IGtub3duICh5ZXQpLCBubyBzdXJnZXJ5IChwYXRpZW50IGlsbCwgZGllZCwgZXhpdGVkIHN0dWR5KSwgcmUtbnVtYmVyZWQgdG8gQUFBCiMgVVNFIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcm90aWQgKGxlZnQgJiByaWdodCkKIyBVU0UgLSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW1vcmFsL2lsaWFjIChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQojIE5PVCBVU0UgLSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKQojIE5PVCBVU0UgLSA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJvdGlkIGJ5cGFzcyBhbmQgaW5qdXJ5IChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQojIE5PVCBVU0UgLSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ldXJ5c21hdGEgKGNhcm90aWQgJiBmZW1vcmFsKQojIE5PVCBVU0UgLSA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3J0YQojIE5PVCBVU0UgLSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBhcnRlcmllcyAocmVuYWwsIHBvcGxpdGVhbCwgdmVydGVicmFsKQojIE5PVCBVU0UgLSA4ICAgICAgICAgICAgICAgICAgICAgICAgZmVtb3JhbCBieXBhc3MsIGFuZ2lvc2VhbCBhbmQgaW5qdXJ5IChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQoKIyMjIEFFZGF0YSRpbmZvcm1lZGNvbnNlbnQKIyAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwKIyBOT1QgVVNFIC0gLTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZwojIE5PVCBVU0UgLSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBkaWVkCiMgVVNFIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcwojIFVTRSAtIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBVU0UgLSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBoZWFsdGggdHJlYXRtZW50CiMgVVNFIC0gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgTk9UIFVTRSAtIDYgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSA5ICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgVVNFIC0gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBOT1QgVVNFIC0gMTEgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudAojIE5PVCBVU0UgLSAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gaGVhbHRoIHRyZWF0bWVudAojIE5PVCBVU0UgLSAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcwojIE5PVCBVU0UgLSAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZQojIFVTRSAtIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgVVNFIC0gMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzCiMgTk9UIFVTRSAtIDIxICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvCiMgTk9UIFVTRSAtIDIyICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8KIyBVU0UgLSAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvCiMgVVNFIC0gMjYgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbwojIE5PVCBVU0UgLSAyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGRvZXNuJ3Qgd2FudCB0bwojIE5PVCBVU0UgLSAyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCB1bmFibGUgdG8gc2lnbgojIE5PVCBVU0UgLSAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBubyByZWFjdGlvbgojIE5PVCBVU0UgLSAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgbG9zdAojIE5PVCBVU0UgLSAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgdG9vIG9sZAojIE5PVCBVU0UgLSAzNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8sIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKQojIFVTRSAtIDM2ICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlCiMgTk9UIFVTRSAtIDM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGVuZHBvaW50CiMgVVNFIC0gMzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWwgbmlldHMgaW52dWxsZW4sIHdlbCBhbGxlcyBnZWJydWlrZW4KIyBVU0UgLSAzOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgaW5mb3JtZWQgY29uY2VudHM6IHllcywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vb2l0IGdlaW5jbHVkZWVyZAoKY2F0KCItIHNhbml0eSBjaGVja2luZyBQUklPUiB0byBzZWxlY3Rpb24iKQpsaWJyYXJ5KGRhdGEudGFibGUpCnJlcXVpcmUobGFiZWxsZWQpCmFlLmdlbmRlciA8LSB0b19mYWN0b3IoQUVEQiRHZW5kZXIpCmFlLmhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCJEhvc3BpdGFsKQp0YWJsZShhZS5nZW5kZXIsIGFlLmhvc3BpdGFsLCBkbm4gPSBjKCJTZXgiLCAiSG9zcGl0YWwiKSkKYWUuYXJ0ZXJ5IDwtIHRvX2ZhY3RvcihBRURCJEFydGVyeV9zdW1tYXJ5KQp0YWJsZShhZS5hcnRlcnksIGFlLmdlbmRlciwgZG5uID0gYygiU2V4IiwgIkFydGVyeSIpKQoKcm0oYWUuZ2VuZGVyLCBhZS5ob3NwaXRhbCwgYWUuYXJ0ZXJ5KQoKIyBJIGNoYW5nZSBudW1lcmljIGFuZCBmYWN0b3JzIG1hbnVhbGx5IGJlY2F1c2UsIHdlbGwsIEkgd291bGRuJ3Qga25vdyBob3cgdG8gZml4IGl0IG90aGVyd2lzZQojIHRvIGhhdmUgdGhpcyAndGliYmxlJyB3b3JrIHdpdGggJ3RhYmxlb25lJy4uLiA6LSkKCkFFREIkQWdlIDwtIGFzLm51bWVyaWMoQUVEQiRBZ2UpCkFFREIkZGlhc3RvbGkgPC0gYXMubnVtZXJpYyhBRURCJGRpYXN0b2xpKQpBRURCJHN5c3RvbGljIDwtIGFzLm51bWVyaWMoQUVEQiRzeXN0b2xpYykKCkFFREIkVENfZmluYWxDVSA8LSBhcy5udW1lcmljKEFFREIkVENfZmluYWxDVSkKQUVEQiRMRExfZmluYWxDVSA8LSBhcy5udW1lcmljKEFFREIkTERMX2ZpbmFsQ1UpCkFFREIkSERMX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJEhETF9maW5hbENVKQpBRURCJFRHX2ZpbmFsQ1UgPC0gYXMubnVtZXJpYyhBRURCJFRHX2ZpbmFsQ1UpCgpBRURCJFRDX2ZpbmFsIDwtIGFzLm51bWVyaWMoQUVEQiRUQ19maW5hbCkKQUVEQiRMRExfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJExETF9maW5hbCkKQUVEQiRIRExfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJEhETF9maW5hbCkKQUVEQiRUR19maW5hbCA8LSBhcy5udW1lcmljKEFFREIkVEdfZmluYWwpCgpBRURCJEFnZSA8LSBhcy5udW1lcmljKEFFREIkQWdlKQpBRURCJEdGUl9NRFJEIDwtIGFzLm51bWVyaWMoQUVEQiRHRlJfTURSRCkKQUVEQiRCTUkgPC0gYXMubnVtZXJpYyhBRURCJEJNSSkKQUVEQiRlQ2lnYXJldHRlcyA8LSBhcy5udW1lcmljKEFFREIkZUNpZ2FyZXR0ZXMpCkFFREIkZVBhY2tZZWFyc1Ntb2tpbmcgPC0gYXMubnVtZXJpYyhBRURCJGVQYWNrWWVhcnNTbW9raW5nKQpBRURCJEVQX2NvbXBvc2l0ZV90aW1lIDwtIGFzLm51bWVyaWMoQUVEQiRFUF9jb21wb3NpdGVfdGltZSkKCkFFREIkbWFjbWVhbjAgPC0gYXMubnVtZXJpYyhBRURCJG1hY21lYW4wKQpBRURCJHNtY21lYW4wIDwtIGFzLm51bWVyaWMoQUVEQiRzbWNtZWFuMCkKQUVEQiRuZXV0cm9waGlscyA8LSBhcy5udW1lcmljKEFFREIkbmV1dHJvcGhpbHMpCkFFREIkTWFzdF9jZWxsc19wbGFxdWUgPC0gYXMubnVtZXJpYyhBRURCJE1hc3RfY2VsbHNfcGxhcXVlKQpBRURCJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkIDwtIGFzLm51bWVyaWMoQUVEQiR2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCkKCnJlcXVpcmUobGFiZWxsZWQpCkFFREIkT1J5ZWFyIDwtIHRvX2ZhY3RvcihBRURCJE9SeWVhcikKQUVEQiRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIkR2VuZGVyKQpBRURCJEhvc3BpdGFsIDwtIHRvX2ZhY3RvcihBRURCJEhvc3BpdGFsKQpBRURCJEtET1FJIDwtIHRvX2ZhY3RvcihBRURCJEtET1FJKQpBRURCJEJNSV9XSE8gPC0gdG9fZmFjdG9yKEFFREIkQk1JX1dITykKQUVEQiREaWFiZXRlc1N0YXR1cyA8LSB0b19mYWN0b3IoQUVEQiREaWFiZXRlc1N0YXR1cykKQUVEQiRTbW9rZXJTdGF0dXMgPC0gdG9fZmFjdG9yKEFFREIkU21va2VyU3RhdHVzKQpBRURCJEFsY29ob2xVc2UgPC0gdG9fZmFjdG9yKEFFREIkQWxjb2hvbFVzZSkKCkFFREIkSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uMSkKQUVEQiRIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWcgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uMikKQUVEQiRIeXBlcnRlbnNpb24uY29tcG9zaXRlIDwtIHRvX2ZhY3RvcihBRURCJEh5cGVydGVuc2lvbi5jb21wb3NpdGUpCkFFREIkSHlwZXJ0ZW5zaW9uLmRydWdzIDwtIHRvX2ZhY3RvcihBRURCJEh5cGVydGVuc2lvbi5kcnVncykKCkFFREIkTWVkLmFudGljb2FndWxhbnRzIDwtIHRvX2ZhY3RvcihBRURCJE1lZC5hbnRpY29hZ3VsYW50cykKQUVEQiRNZWQuYWxsLmFudGlwbGF0ZWxldCA8LSB0b19mYWN0b3IoQUVEQiRNZWQuYWxsLmFudGlwbGF0ZWxldCkKQUVEQiRNZWQuU3RhdGluLkxMRCA8LSB0b19mYWN0b3IoQUVEQiRNZWQuU3RhdGluLkxMRCkKCkFFREIkU3Ryb2tlX0R4IDwtIHRvX2ZhY3RvcihBRURCJFN0cm9rZV9EeCkKQUVEQiRDQURfaGlzdG9yeSA8LSB0b19mYWN0b3IoQUVEQiRDQURfaGlzdG9yeSkKQUVEQiRQQU9EIDwtIHRvX2ZhY3RvcihBRURCJFBBT0QpCkFFREIkUGVyaXBoZXJhbC5pbnRlcnYgPC0gdG9fZmFjdG9yKEFFREIkUGVyaXBoZXJhbC5pbnRlcnYpCgpBRURCJHN5bXB0IDwtIHRvX2ZhY3RvcihBRURCJHN5bXB0KQpBRURCJFN5bXB0b21zLjNnIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjNnKQpBRURCJFN5bXB0b21zLjRnIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjRnKQpBRURCJFN5bXB0b21zLjVHIDwtIHRvX2ZhY3RvcihBRURCJFN5bXB0b21zLjVHKQpBRURCJEFzeW1wdFN5bXB0IDwtIHRvX2ZhY3RvcihBRURCJEFzeW1wdFN5bXB0KQpBRURCJEFzeW1wdFN5bXB0MkcgPC0gdG9fZmFjdG9yKEFFREIkQXN5bXB0U3ltcHQyRykKCkFFREIkcmVzdGVub3MgPC0gdG9fZmFjdG9yKEFFREIkcmVzdGVub3MpCkFFREIkc3Rlbm9zZSA8LSB0b19mYWN0b3IoQUVEQiRzdGVub3NlKQpBRURCJEVQX2NvbXBvc2l0ZSA8LSB0b19mYWN0b3IoQUVEQiRFUF9jb21wb3NpdGUpCkFFREIkTWFjcm9waGFnZXMuYmluIDwtIHRvX2ZhY3RvcihBRURCJE1hY3JvcGhhZ2VzLmJpbikKQUVEQiRTTUMuYmluIDwtIHRvX2ZhY3RvcihBRURCJFNNQy5iaW4pCkFFREIkSVBILmJpbiA8LSB0b19mYWN0b3IoQUVEQiRJUEguYmluKQpBRURCJENhbGMuYmluIDwtIHRvX2ZhY3RvcihBRURCJENhbGMuYmluKQpBRURCJENvbGxhZ2VuLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRDb2xsYWdlbi5iaW4pCkFFREIkRmF0LmJpbl8xMCA8LSB0b19mYWN0b3IoQUVEQiRGYXQuYmluXzEwKQpBRURCJEZhdC5iaW5fNDAgPC0gdG9fZmFjdG9yKEFFREIkRmF0LmJpbl80MCkKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlIDwtIHRvX2ZhY3RvcihBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGUpCgpBRURCJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCJEFydGVyeV9zdW1tYXJ5KQoKQUVEQiRpbmZvcm1lZGNvbnNlbnQgPC0gdG9fZmFjdG9yKEFFREIkaW5mb3JtZWRjb25zZW50KQoKQUVEQi5DRUEgPC0gc3Vic2V0KEFFREIsCiAgICAgICAgICAgICAgICAgICAgKEFydGVyeV9zdW1tYXJ5ID09ICJjYXJvdGlkIChsZWZ0ICYgcmlnaHQpIiB8IEFydGVyeV9zdW1tYXJ5ID09ICJvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKSIpICYgIyB3ZSBvbmx5IHdhbnQgY2Fyb3RpZHMKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm1pc3NpbmciICYgIyB3ZSBhcmUgcmVhbGx5IHN0cmljdCBpbiBzZWxlY3RpbmcgYmFzZWQgb24gJ2luZm9ybWVkIGNvbnNlbnQnIQogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRpZWQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkb2Vzbid0IHdhbnQgdG8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB1bmFibGUgdG8gc2lnbiIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgbG9zdCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHRvbyBvbGQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJub29pdCBnZWluY2x1ZGVlcmQiICYgCiAgICAgICAgICAgICAgICAgICAgICFpcy5uYShBc3ltcHRTeW1wdDJHKSkKIyBBRURCLkNFQVsxOjEwLCAxOjEwXQpkaW0oQUVEQi5DRUEpCmBgYAoKCmBgYHtyIEJhc2VsaW5lIEFFREI6IGNyZWF0aW9ufQpjYXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpCmNhdCgiQ1JFQVRFIEJBU0VMSU5FIFRBQkxFXG4iKQoKIyBCYXNlbGluZSB0YWJsZSB2YXJpYWJsZXMKYmFzZXRhYmxlX3ZhcnMgPSBjKCJIb3NwaXRhbCIsICJPUnllYXIiLAogICAgICAgICAgICAgICAgICAgIkFnZSIsICJHZW5kZXIiLCAKICAgICAgICAgICAgICAgICAgICJUQ19maW5hbENVIiwgIkxETF9maW5hbENVIiwgIkhETF9maW5hbENVIiwgIlRHX2ZpbmFsQ1UiLCAKICAgICAgICAgICAgICAgICAgICJUQ19maW5hbCIsICJMRExfZmluYWwiLCAiSERMX2ZpbmFsIiwgIlRHX2ZpbmFsIiwgCiAgICAgICAgICAgICAgICAgICAic3lzdG9saWMiLCAiZGlhc3RvbGkiLCAiR0ZSX01EUkQiLCAiQk1JIiwgCiAgICAgICAgICAgICAgICAgICAiS0RPUUkiLCAiQk1JX1dITyIsIAogICAgICAgICAgICAgICAgICAgIlNtb2tlclN0YXR1cyIsICJBbGNvaG9sVXNlIiwKICAgICAgICAgICAgICAgICAgICJEaWFiZXRlc1N0YXR1cyIsIAogICAgICAgICAgICAgICAgICAgIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0IiwgIkh5cGVydGVuc2lvbi5zZWxmcmVwb3J0ZHJ1ZyIsICJIeXBlcnRlbnNpb24uY29tcG9zaXRlIiwgIkh5cGVydGVuc2lvbi5kcnVncyIsIAogICAgICAgICAgICAgICAgICAgIk1lZC5hbnRpY29hZ3VsYW50cyIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsICJNZWQuU3RhdGluLkxMRCIsIAogICAgICAgICAgICAgICAgICAgIlN0cm9rZV9EeCIsICJzeW1wdCIsICJTeW1wdG9tcy41RyIsICJBc3ltcHRTeW1wdCIsICJBc3ltcHRTeW1wdDJHIiwKICAgICAgICAgICAgICAgICAgICJyZXN0ZW5vcyIsICJzdGVub3NlIiwKICAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICAiRVBfY29tcG9zaXRlIiwgIkVQX2NvbXBvc2l0ZV90aW1lIiwKICAgICAgICAgICAgICAgICAgICJtYWNtZWFuMCIsICJzbWNtZWFuMCIsICJNYWNyb3BoYWdlcy5iaW4iLCAiU01DLmJpbiIsCiAgICAgICAgICAgICAgICAgICAibmV1dHJvcGhpbHMiLCAiTWFzdF9jZWxsc19wbGFxdWUiLAogICAgICAgICAgICAgICAgICAgIklQSC5iaW4iLCAidmVzc2VsX2RlbnNpdHlfYXZlcmFnZWQiLAogICAgICAgICAgICAgICAgICAgIkNhbGMuYmluIiwgIkNvbGxhZ2VuLmJpbiIsIAogICAgICAgICAgICAgICAgICAgIkZhdC5iaW5fMTAiLCAiRmF0LmJpbl80MCIsICJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIikKCmJhc2V0YWJsZV9iaW4gPSBjKCJHZW5kZXIiLCAKICAgICAgICAgICAgICAgICAgIktET1FJIiwgIkJNSV9XSE8iLCAKICAgICAgICAgICAgICAgICAgIlNtb2tlclN0YXR1cyIsICJBbGNvaG9sVXNlIiwKICAgICAgICAgICAgICAgICAgIkRpYWJldGVzU3RhdHVzIiwgCiAgICAgICAgICAgICAgICAgICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCIsICJIeXBlcnRlbnNpb24uc2VsZnJlcG9ydGRydWciLCAiSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSIsICJIeXBlcnRlbnNpb24uZHJ1Z3MiLCAKICAgICAgICAgICAgICAgICAgIk1lZC5hbnRpY29hZ3VsYW50cyIsICJNZWQuYWxsLmFudGlwbGF0ZWxldCIsICJNZWQuU3RhdGluLkxMRCIsIAogICAgICAgICAgICAgICAgICAiU3Ryb2tlX0R4IiwgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IiwgIkFzeW1wdFN5bXB0MkciLAogICAgICAgICAgICAgICAgICAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICJFUF9jb21wb3NpdGUiLCAiTWFjcm9waGFnZXMuYmluIiwgIlNNQy5iaW4iLAogICAgICAgICAgICAgICAgICAiSVBILmJpbiIsIAogICAgICAgICAgICAgICAgICAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICJGYXQuYmluXzEwIiwgIkZhdC5iaW5fNDAiLCAiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSIpCiMgYmFzZXRhYmxlX2JpbgoKYmFzZXRhYmxlX2NvbiA9IGJhc2V0YWJsZV92YXJzWyFiYXNldGFibGVfdmFycyAlaW4lIGJhc2V0YWJsZV9iaW5dCiMgYmFzZXRhYmxlX2NvbgpgYGAKCiMjIyBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rIFN0dWR5OiBiYXNlbGluZSBjaGFyYWN0ZXJpc3RpY3MKU2hvd2luZyB0aGUgYmFzZWxpbmUgdGFibGUgb2YgdGhlIHdob2xlIEF0aGVyby1FeHByZXNzIEJpb2JhbmsuCmBgYHtyIEJhc2VsaW5lIEFFREI6IFZpc3VhbGl6ZX0KIyBDcmVhdGUgYmFzZWxpbmUgdGFibGVzCiMgaHR0cDovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8xMzMyMV9kYTMxNDYzM2RiOTI0ZGM3ODk4NmE4NTA4MTNhNTBkNS5odG1sCkFFREIuQ0VBLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhY3RvclZhcnMgPSBiYXNldGFibGVfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyYXRhID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEFFREIuQ0VBLCBpbmNsdWRlTkEgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubm9ybWFsID0gYygpLCBtaXNzaW5nID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IEZBTFNFLCBub1NwYWNlcyA9IEZBTFNFLCBzaG93QWxsTGV2ZWxzID0gVFJVRSwgZXhwbGFpbiA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJwZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnREaWdpdHMgPSAzKVssMTozXQoKYGBgCgoKIyMgQUVTQ1JOQTogYmFzZWxpbmUgY2hhcmFjdGVyaXN0aWNzCgpgYGB7ciBCYXNlbGluZTogY3JlYXRpb259Cm1ldGFkYXRhIDwtIHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEgJT4lIGFzX3RpYmJsZSgpICU+JSBzZXBhcmF0ZShvcmlnLmlkZW50LCBjKCJQYXRpZW50IiwgTkEpKQpzY1JOQXNlcURhdGFNZXRhIDwtIG1ldGFkYXRhICU+JSBkaXN0aW5jdChQYXRpZW50LCAua2VlcF9hbGwgPSBUUlVFKQoKc2NSTkFzZXFEYXRhTWV0YUFFIDwtIG1lcmdlKHNjUk5Bc2VxRGF0YU1ldGEsIEFFREIsIGJ5LnggPSAiUGF0aWVudCIsIGJ5LnkgPSAiU1RVRFlfTlVNQkVSIiwgc29ydCA9IEZBTFNFLCBhbGwueCA9IFRSVUUpCmRpbShzY1JOQXNlcURhdGFNZXRhQUUpCgojIFJlcGxhY2UgbWlzc2luZyBkYXRhIAojIFJlZjogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL25hbmlhci92aWduZXR0ZXMvcmVwbGFjZS13aXRoLW5hLmh0bWwKcmVxdWlyZShuYW5pYXIpCgpuYV9zdHJpbmdzIDwtIGMoIk5BIiwgIk4gQSIsICJOIC8gQSIsICJOL0EiLCAiTi8gQSIsIAogICAgICAgICAgICAgICAgIk5vdCBBdmFpbGFibGUiLCAiTm90IGF2YWlsYWJsZSIsIAogICAgICAgICAgICAgICAgIm1pc3NpbmciLCAKICAgICAgICAgICAgICAgICItOTk5IiwgIi05OSIsIAogICAgICAgICAgICAgICAgIk5vIGRhdGEgYXZhaWxhYmxlL21pc3NpbmciLCAiTm8gZGF0YSBhdmFpbGFibGUvTWlzc2luZyIpCiMgVGhlbiB5b3Ugd3JpdGUgfi54ICVpbiUgbmFfc3RyaW5ncyAtIHdoaWNoIHJlYWRzIGFzIOKAnGRvZXMgdGhpcyB2YWx1ZSBvY2N1ciBpbiB0aGUgbGlzdCBvZiBOQSBzdHJpbmdz4oCdLgoKc2NSTkFzZXFEYXRhTWV0YUFFICU+JQogIHJlcGxhY2Vfd2l0aF9uYV9hbGwoY29uZGl0aW9uID0gfi54ICVpbiUgbmFfc3RyaW5ncykKCmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpCmNhdCgiU0VMRUNUSU9OIFRIRSBTSElaWkxFIikKCmNhdCgiLSBzYW5pdHkgY2hlY2tpbmcgUFJJT1IgdG8gc2VsZWN0aW9uIikKbGlicmFyeShkYXRhLnRhYmxlKQpyZXF1aXJlKGxhYmVsbGVkKQphZS5nZW5kZXIgPC0gdG9fZmFjdG9yKHNjUk5Bc2VxRGF0YU1ldGFBRSRHZW5kZXIpCmFlLmhvc3BpdGFsIDwtIHRvX2ZhY3RvcihzY1JOQXNlcURhdGFNZXRhQUUkSG9zcGl0YWwpCnRhYmxlKGFlLmdlbmRlciwgYWUuaG9zcGl0YWwsIGRubiA9IGMoIlNleCIsICJIb3NwaXRhbCIpLCB1c2VOQSA9ICJpZmFueSIpCgphZS5hcnRlcnkgPC0gdG9fZmFjdG9yKHNjUk5Bc2VxRGF0YU1ldGFBRSRBcnRlcnlfc3VtbWFyeSkKdGFibGUoYWUuYXJ0ZXJ5LCBhZS5nZW5kZXIsIGRubiA9IGMoIlNleCIsICJBcnRlcnkiKSwgdXNlTkEgPSAiaWZhbnkiKQoKYWUuaWMgPC0gdG9fZmFjdG9yKHNjUk5Bc2VxRGF0YU1ldGFBRSRpbmZvcm1lZGNvbnNlbnQpCnRhYmxlKGFlLmljLCBhZS5nZW5kZXIsIHVzZU5BID0gImlmYW55IikKCnJtKGFlLmdlbmRlciwgYWUuaG9zcGl0YWwsIGFlLmFydGVyeSwgYWUuaWMpCgoKc2NSTkFzZXFEYXRhTWV0YUFFLmFsbCA8LSBzdWJzZXQoc2NSTkFzZXFEYXRhTWV0YUFFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFydGVyeV9zdW1tYXJ5ID09ICJjYXJvdGlkIChsZWZ0ICYgcmlnaHQpIiB8IEFydGVyeV9zdW1tYXJ5ID09ICJvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKSIgKSAmICMgd2Ugb25seSB3YW50IGNhcm90aWRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibWlzc2luZyIgJiAjIHdlIGFyZSByZWFsbHkgc3RyaWN0IGluIHNlbGVjdGluZyBiYXNlZCBvbiAnaW5mb3JtZWQgY29uc2VudCchCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRpZWQiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gaGVhbHRoIHRyZWF0bWVudCIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRvZXNuJ3Qgd2FudCB0byIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB1bmFibGUgdG8gc2lnbiIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBubyByZWFjdGlvbiIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBsb3N0IiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHRvbyBvbGQiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIG1lZGljYWwgaW5mbywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBlbmRwb2ludCIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vb2l0IGdlaW5jbHVkZWVyZCIpCiMgc2NSTkFzZXFEYXRhTWV0YUFFLmFsbFsxOjEwLCAxOjEwXQpkaW0oc2NSTkFzZXFEYXRhTWV0YUFFLmFsbCkKIyBEVDo6ZGF0YXRhYmxlKHNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwpCgpgYGAKClNob3dpbmcgdGhlIGJhc2VsaW5lIHRhYmxlLgpgYGB7ciBCYXNlbGluZTogVmlzdWFsaXplfQpjYXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKQpjYXQoIkNSRUFURSBCQVNFTElORSBUQUJMRSIpCgojIENyZWF0ZSBiYXNlbGluZSB0YWJsZXMKIyBodHRwOi8vcnN0dWRpby1wdWJzLXN0YXRpYy5zMy5hbWF6b25hd3MuY29tLzEzMzIxX2RhMzE0NjMzZGI5MjRkYzc4OTg2YTg1MDgxM2E1MGQ1Lmh0bWwKc2NSTkFzZXFEYXRhTWV0YUFFLmFsbC50YWJsZU9uZSA9IHByaW50KENyZWF0ZVRhYmxlT25lKHZhcnMgPSBiYXNldGFibGVfdmFycywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmYWN0b3JWYXJzID0gYmFzZXRhYmxlX2JpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmF0YSA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzY1JOQXNlcURhdGFNZXRhQUUuYWxsLCBpbmNsdWRlTkEgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubm9ybWFsID0gYygpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IEZBTFNFLCBzaG93QWxsTGV2ZWxzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAicCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnREaWdpdHMgPSAzKVssMToyXQoKYGBgCgpXcml0aW5nIHRoZSBiYXNlbGluZSB0YWJsZSB0byBFeGNlbCBmb3JtYXQuIApgYGB7ciBCYXNlbGluZTogd3JpdGV9CiMgV3JpdGUgYmFzZXRhYmxlCnJlcXVpcmUob3Blbnhsc3gpCndyaXRlLnhsc3goZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuQUUuQmFzZWxpbmVUYWJsZS5zY1JOQXNlcS54bHN4IiksIAogICAgICAgICAgIGZvcm1hdChzY1JOQXNlcURhdGFNZXRhQUUuYWxsLnRhYmxlT25lLCBkaWdpdHMgPSA1LCBzY2llbnRpZmljID0gRkFMU0UpICwgcm93TmFtZXMgPSBUUlVFLCBjb2xOYW1lcyA9IFRSVUUpCgoKYGBgCgoKIyBBRVNDUk5BCgojIyBRdWFsaXR5IGNvbnRyb2wKSGVyZSByZXZpZXcgdGhlIG51bWJlciBvZiBjZWxscyBwZXIgc2FtcGxlLCBwbGF0ZSwgYW5kIHBhdGllbnRzLiBBbmQgcGxvdCB0aGUgcmF0aW8ncyBwZXIgc2FtcGxlIGFuZCBzdHVkeSBudW1iZXIuCmBgYHtyIFF1YWxpdHlDb250cm9sfQojIyBjaGVjayBzdHVmZgpjYXQoIlxuSG93IG1hbnkgY2VsbHMgcGVyIHR5cGUgLi4uPyIpCnNvcnQodGFibGUoc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRTQ1Rfc25uX3Jlcy4wLjgpKQoKIyBjYXQoIlxuXG5Ib3cgbWFueSBjZWxscyBwZXIgcGxhdGUgLi4uPyIpCiMgc29ydCh0YWJsZShzY1JOQXNlcURhdGFAbWV0YS5kYXRhJElEKSkKCiMgY2F0KCJcblxuSG93IG1hbnkgY2VsbHMgcGVyIHR5cGUgcGVyIHBsYXRlIC4uLj8iKQojIHRhYmxlKHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkU0NUX3Nubl9yZXMuMC44LCBzY1JOQXNlcURhdGFAbWV0YS5kYXRhJElEKQoKY2F0KCJcblxuSG93IG1hbnkgY2VsbHMgcGVyIHBhdGllbnQgLi4uPyIpCnNvcnQodGFibGUoc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRQYXRpZW50KSkKCmNhdCgiXG5cblZpc3VhbGl6aW5nIHRoZXNlIHJhdGlvJ3MgcGVyIHN0dWR5IG51bWJlciBhbmQgc2FtcGxlIC4uLj8iKQpVTUFQUGxvdChzY1JOQXNlcURhdGEsIGxhYmVsID0gVFJVRSwgcHQuc2l6ZSA9IDEuMjUsIGxhYmVsLnNpemUgPSA0LCBncm91cC5ieSA9ICJpZGVudCIsCiAgICAgICAgIHJlcGVsID0gVFJVRSkKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5VTUFQLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVU1BUC5wcyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgoKIyBiYXJwbG90KHByb3AudGFibGUoeCA9IHRhYmxlKHNjUk5Bc2VxRGF0YUBhY3RpdmUuaWRlbnQsIHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkUGF0aWVudCkpLCAKIyAgICAgICAgIGNleC5heGlzID0gMS4wLCBjZXgubmFtZXMgPSAwLjUsIGxhcyA9IDEsCiMgICAgICAgICBjb2wgPSB1aXRob2ZfY29sb3IsIHhsYWIgPSAic3R1ZHkgbnVtYmVyIiwgbGVnZW5kLnRleHQgPSBGQUxTRSwgYXJncy5sZWdlbmQgPSBsaXN0KHggPSAiYm90dG9tIikpCiMgZGV2LmNvcHkocGRmLCBwYXN0ZTAoUUNfbG9jLCAiLyIsIFRvZGF5LCAiLmNlbGxfcmF0aW9zX3Blcl9zYW1wbGUucGRmIikpCiMgZGV2Lm9mZigpCgojIGJhcnBsb3QocHJvcC50YWJsZSh4ID0gdGFibGUoc2NSTkFzZXFEYXRhQGFjdGl2ZS5pZGVudCwgc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRJRCkpLCAKIyAgICAgICAgIGNleC5heGlzID0gMS4wLCBjZXgubmFtZXMgPSAwLjUsIGxhcyA9IDIsCiMgICAgICAgICBjb2wgPSB1aXRob2ZfY29sb3IsIHhsYWIgPSAic2FtcGxlIElEIiwgbGVnZW5kLnRleHQgPSBGQUxTRSwgYXJncy5sZWdlbmQgPSBsaXN0KHggPSAiYm90dG9tIikpCiMgZGV2LmNvcHkocGRmLCBwYXN0ZTAoUUNfbG9jLCAiLyIsIFRvZGF5LCAiLmNlbGxfcmF0aW9zX3Blcl9zYW1wbGVfcGVyX3BsYXRlLnBkZiIpKQojIGRldi5vZmYoKQoKCgpgYGAKCiMjIFZpc3VhbGlzYXRpb25zCgpMZXQncyBwcm9qZWN0IGtub3duIGNlbGx1bGFyIG1hcmtlcnMuCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiB0U05FIEV4cGxvcmF0aW9ufQoKVU1BUFBsb3Qoc2NSTkFzZXFEYXRhLCBsYWJlbCA9IEZBTFNFLCBwdC5zaXplID0gMS4yNSwgbGFiZWwuc2l6ZSA9IDQsIGdyb3VwLmJ5ID0gImlkZW50IiwKICAgICAgICAgcmVwZWwgPSBUUlVFKQoKIyBlbmRvdGhlbGlhbCBjZWxscwpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0QzNCIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiRUROMSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiRUROUkEiLCAiRUROUkIiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNESDUiLCAiUEVDQU0xIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJBQ0tSMSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyBTTUMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIk1ZSDExIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJMR0FMUzMiLCAiQUNUQTIiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCiMgbWFjcm9waGFnZXMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNEMTQiLCAiQ0Q2OCIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0QzNiIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyB0LWNlbGxzCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDNFIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDQiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKIyBGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0Q4IiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgojIGItY2VsbHMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNENzlBIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgojIG1hc3QgY2VsbHMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIktJVCIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyBOSyBjZWxscwpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiTkNBTTEiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCmBgYAoKCiMjIFRhcmdldHMgb2YgaW50ZXJlc3Q6IAoKV2UgY2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0cyBnZW5lcywgX2ByIHRhcmdldF9nZW5lc2BfLCB3ZXJlIHNlcXVlbmNlZCB1c2luZyBvdXIgbWV0aG9kIChTVEFSc2VxKS4gCgpTZXZlcmFsIGdlbmVzIGFyZSBub3QgcHJlc2VudCBvciBoYXZlIGRpZmZlcmVudCBuYW1lcywgdGhlc2UgYXJlIGxpc3RlZCBoZXJlLCBhbmQgd2VyZSBtYW51YWxseSByZW1vdmVkIGZyb20vY2hhbmdlZCBpbiB0aGUgbGlzdC4KCi0gX0FDMDExMjk0LjNfID09PiBub3QgZm91bmQKLSBfQzZvcmYxOTVfID0+IF9MSU5DMDE2MDBfIHJlcGxhY2VtZW50LCBub3QgZm91bmQKLSBfQzlvcmY1M18gPT4gX0NES04yQS1EVF8gcmVwbGFjZW1lbnQsIG5vdCBmb3VuZAotIF9BTDEzNzAyNi4xXyA9PT4gbm90IGZvdW5kCi0gX0RVUEQxXyA9PiBfRFVTUDI5XyByZXBsYWNlbWVudCwgbm90IGZvdW5kCi0gX1JQMTEtMTQ1RTUuNV8gPT0+IG5vdCBmb3VuZAotIF9QVlJMMl8gPT4gX05FQ1RJTjJfIHJlcGxhY2VtZW50Ci0gX0tJQUExNDYyXyA9PiBfSkNBRF8gcmVwbGFjZW1lbnQKLSBfWk5GMzJfID09PiBub3QgZm91bmQKLSBfQkNBTV8gPT0+IG5vdCBmb3VuZAoKYGBge3IgbGlzdCB0YXJnZXQgZ2VuZXN9CnRhcmdldF9nZW5lcwpgYGAKCiMjIyBFeHByZXNzaW9uIGluIGNlbGwgY29tbXVuaXRpZXMKYGBge3IgVmlzdWFsaXNhdGlvbjogcHJlcGFyYXRpb259Cgp0YXJnZXRfZ2VuZXNfcm0gPC0gYygiQUMwMTEyOTQuMyIsICJDNm9yZjE5NSIsICJDOW9yZjUzIiwgIkFMMTM3MDI2LjEiLCAiRFVQRDEiLCAiUlAxMS0xNDVFNS41IiwgIlBWUkwyIiwKICAgICAgICAgICAgICAgICAgICAgIlJQMS0yNTdBNy40IiwgIlJQMS0yNTdBNy41IiwgIktJQUExNDYyIiwKICAgICAgICAgICAgICAgICAgICAgIlpORjMyIiwgIkJDQU0iKQoKdGVtcCA9IHRhcmdldF9nZW5lc1shdGFyZ2V0X2dlbmVzICVpbiUgdGFyZ2V0X2dlbmVzX3JtXQoKdGFyZ2V0X2dlbmVzX3FjIDwtIGModGVtcCwgIk5FQ1RJTjIiLCAiSkNBRCIpCgp0YXJnZXRfZ2VuZXNfcWMKCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVGFyZ2V0cyBGZWF0dXJlIGFuZCBEb3QgUGxvdHMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoUkNvbG9yQnJld2VyKQoKcDEgPC0gRG90UGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgICAgIGNvbHMgPSAiUmRCdSIpCgpwMSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0PTEsIHNpemUgPSA1KSkKCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuRG90UGxvdC5UYXJnZXRzLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuRG90UGxvdC5UYXJnZXRzLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCnJtKHAxKQoKIyBGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYyh0YXJnZXRfZ2VuZXNfcWMpLAojICAgICAgICAgICAgIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIiwgIiM5QTM0ODAiLCIjMTI5MEQ5IiksCiMgICAgICAgICAgICAgY29tYmluZSA9IFRSVUUpCiMgCiMgZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5GZWF0dXJlUGxvdC5UYXJnZXRzLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCiMgZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5GZWF0dXJlUGxvdC5UYXJnZXRzLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCgpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFRhcmdldHN9CiMgVmxuUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gIkRVU1AyOSIpCgpmb3IgKEdFTkUgaW4gdGFyZ2V0X2dlbmVzX3FjKXsKICBwcmludChwYXN0ZTAoIlByb2plY3RpbmcgdGhlIGV4cHJlc3Npb24gb2YgIiwgR0VORSwgIi4iKSkKCiAgdnAxIDwtICBWbG5QbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBHRU5FKSArIAogICAgeGxhYigiY2VsbCBjb21tdW5pdGllcyIpICsgCiAgICB5bGFiKGJxdW90ZSgibm9ybWFsaXplZCBleHByZXNzaW9uIikpICsKICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAgIGdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVmxuUGxvdC4iLEdFTkUsIi5wbmciKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQogICAgZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5WbG5QbG90LiIsR0VORSwiLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAKICAjIHByaW50KHZwMSkKICAKfQoKYGBgCgoKCiMjIyBEaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBiZXR3ZWVuIGNlbGwgY29tbXVuaXRpZXMKCkhlcmUgd2UgcHJvamVjdCBnZW5lcyB0byBvbmx5IHRoZSBicm9hZCBjZWxsIGNvbW11bml0aWVzOiAKCi0gbWFjcm9waGFnZXMKLSBlbmRvdGhlbGlhbCBjZWxscwotIHNtb290aCBtdXNjbGUgY2VsbHMKLSBULWNlbGxzCi0gQi1jZWxscwotIE1hc3QgY2VsbHMKLSBOSy1jZWxscwotIE1peGVkIGNlbGxzCgoKIyMjIyBNYWNyb3BoYWdlcwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBtYWNyb3BoYWdlcyBjZWxsIGNvbW11bml0aWVzIChfQ0QxNC9DRDY4XzxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTUFDIGNhbGN1bGF0ZX0KTl9HRU5FUz0yMDU1MgpNQUMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJSSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygjIkNEMTQrQ0Q2OCsgTSBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSUkgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRyZWciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQ0FNMSsgTksiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSUkiKSkKCkRUOjpkYXRhdGFibGUoTUFDLm1hcmtlcnMpCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBNQUMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Ck1BQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKE1BQy5tYXJrZXJzLAogICAgbGFiID0gcm93bmFtZXMoTUFDLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiTWFjcm9waGFnZSBtYXJrZXJzXG4oTWFjcm9waGFnZSBjb21tdW5pdGllcyB2cyB0aGUgcmVzdCkiLAogICAgdGl0bGVMYWJTaXplID0gMTQsCiAgICBwQ3V0b2ZmID0gMC4wNS9OX0dFTkVTLCAjIDIwNTUyIGdlbmVzCiAgICBGQ2N1dG9mZiA9IDEuMjUsCiAgICBwb2ludFNpemUgPSAxLjUsCiAgICBsYWJTaXplID0gMy4wLAogICAgbGVnZW5kTGFiZWxzID1jKCdOUycsJ2F2Zy4gZm9sZC1jaGFuZ2UnLCdQJywKICAgICAgJ1AgJiBhdmcuIGZvbGQtY2hhbmdlJyksCiAgICBsZWdlbmRQb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICBsZWdlbmRJY29uU2l6ZSA9IDMuMCwKICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMiwKICAgIGNvbENvbm5lY3RvcnMgPSAiIzU5NUE1QyIsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwKICAgIGdyaWRsaW5lcy5taW5vciA9IEZBTFNFKQpNQUNfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uTUFDLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBNQUNfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KYGBge3IgUmVzdWx0cyBNQUN9CmxpYnJhcnkodGliYmxlKQpNQUMubWFya2VycyA8LSBhZGRfY29sdW1uKE1BQy5tYXJrZXJzLCBHZW5lID0gcm93Lm5hbWVzKE1BQy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIE1BQy5tYXJrZXJzW01BQy5tYXJrZXJzJEdlbmUgJWluJSB0YXJnZXRfZ2VuZXNfcWMsXQoKRFQ6OmRhdGF0YWJsZSh0ZW1wKQpgYGAKCmBgYHtyIFJlc3VsdHMgTUFDOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLk1BQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKCiMjIyMgU21vb3RoIG11c2NsZSBjZWxscwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzbW9vdGggbXVzY2xlIGNlbGwgY29tbXVuaXRpZXMgKF9BQ1RBMl88c3VwPis8L3N1cD4pLCBhbmQgYWxsIG90aGVyIGNvbW11bml0aWVzLgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIFNNQyBjYWxjdWxhdGV9Ck5fR0VORVM9MjA1NTIKU01DLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQUNUQTIrIFNNQyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0QxNCtDRDY4KyBNIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSUkgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRyZWciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJBQ1RBMisgU01DIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5DQU0xKyBOSyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJSSIpKQoKRFQ6OmRhdGF0YWJsZShTTUMubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIFNNQywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KU01DX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oU01DLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhTTUMubWFya2VycyksCiAgICB4ID0gImF2Z19sb2cyRkMiLAogICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgc2VsZWN0TGFiID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgYXhpc0xhYlNpemUgPSAxMiwKICAgIHhsYWIgPSAiYXZlcmFnZSBmb2xkLWNoYW5nZSIsCiAgICB0aXRsZSA9ICJTTUMgbWFya2Vyc1xuKFNNQyBjb21tdW5pdGllcyB2cyB0aGUgcmVzdCkiLAogICAgdGl0bGVMYWJTaXplID0gMTQsCiAgICBwQ3V0b2ZmID0gMC4wNS9OX0dFTkVTLCAjIDIwNTUyIGdlbmVzCiAgICBGQ2N1dG9mZiA9IDEuMjUsCiAgICBwb2ludFNpemUgPSAxLjUsCiAgICBsYWJTaXplID0gMy4wLAogICAgbGVnZW5kTGFiZWxzID1jKCdOUycsJ2F2Zy4gZm9sZC1jaGFuZ2UnLCdQJywKICAgICAgJ1AgJiBhdmcuIGZvbGQtY2hhbmdlJyksCiAgICBsZWdlbmRQb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICBsZWdlbmRJY29uU2l6ZSA9IDMuMCwKICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMiwKICAgIGNvbENvbm5lY3RvcnMgPSAiIzU5NUE1QyIsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwKICAgIGdyaWRsaW5lcy5taW5vciA9IEZBTFNFKQpTTUNfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uU01DLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBTTUNfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KYGBge3IgUmVzdWx0cyBTTUN9CmxpYnJhcnkodGliYmxlKQpTTUMubWFya2VycyA8LSBhZGRfY29sdW1uKFNNQy5tYXJrZXJzLCBHZW5lID0gcm93Lm5hbWVzKFNNQy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIFNNQy5tYXJrZXJzW1NNQy5tYXJrZXJzJEdlbmUgJWluJSB0YXJnZXRfZ2VuZXNfcWMsXQoKRFQ6OmRhdGF0YWJsZSh0ZW1wKQpgYGAKCmBgYHtyIFJlc3VsdHMgU01DOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLlNNQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKCiMjIyMgRW5kb3RoZWxpYWwgY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgZW5kb3RoZWxpYWwgY2VsbCBjb21tdW5pdGllcyAoX0NEMzRfPHN1cD4rPC9zdXA+KSwgYW5kIGFsbCBvdGhlciBjb21tdW5pdGllcy4KYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBFQyBjYWxjdWxhdGV9Ck5fR0VORVM9MjA1NTIKRUMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDM0KyBFQyBJIiwgIkNEMzQrIEVDIElJIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSSAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVHJlZyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMzQrIEVDIEkiLCAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQ0FNMSsgTksiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSUkiKSkKCkRUOjpkYXRhdGFibGUoRUMubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIEVDLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpFQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKEVDLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhFQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIkVuZG90aGVsaWFsIGNlbGwgbWFya2Vyc1xuKEVDIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCkVDX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLkVDLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBFQ19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgpgYGB7ciBSZXN1bHRzIEVDfQpsaWJyYXJ5KHRpYmJsZSkKRUMubWFya2VycyA8LSBhZGRfY29sdW1uKEVDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoRUMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBFQy5tYXJrZXJzW0VDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBFQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5FQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIyBULWNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIFQtY2VsbCBjb21tdW5pdGllcyAoX0NEMy9DRDQvQ0Q4XzxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gVGNlbGwgY2FsY3VsYXRlfQpOX0dFTkVTPTIwNTUyClRDLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQ0QzK0NEOEErIFQgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUcmVnIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0QzK0NEOCsgVCBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrQ0Q4QSsgVCBJSSAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrQ0Q4IFQgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMytDRDQrIFQgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIEkiLCAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQ0FNMSsgTksiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSUkiKSkKCkRUOjpkYXRhdGFibGUoVEMubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIFRjZWxsLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpUQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKFRDLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhUQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIlQtY2VsbCBtYXJrZXJzXG4oVC1jZWxsIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpClRDX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLlRDLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBUQ19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgpgYGB7ciBSZXN1bHRzIFRDfQpsaWJyYXJ5KHRpYmJsZSkKVEMubWFya2VycyA8LSBhZGRfY29sdW1uKFRDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoVEMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBUQy5tYXJrZXJzW1RDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBUQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5UQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKCiMjIyMgQi1jZWxscwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBCLWNlbGwgY29tbXVuaXRpZXMgKF9DRDc5QV88c3VwPis8L3N1cD4pLCBhbmQgYWxsIG90aGVyIGNvbW11bml0aWVzLgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIEJjZWxsIGNhbGN1bGF0ZX0KTl9HRU5FUz0yMDU1MgpCQy5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHNjUk5Bc2VxRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoIkNENzlBKyBCIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSUkiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNEMTQrQ0Q2OCsgTSBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUlJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUcmVnIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIEkiLCAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQ0FNMSsgTksiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0lUKyBNQyIpKQoKRFQ6OmRhdGF0YWJsZShCQy5tYXJrZXJzKQpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gQmNlbGwsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkJDX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oQkMubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKEJDLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiQi1jZWxsIG1hcmtlcnNcbihCLWNlbGwgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvTl9HRU5FUywgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKQkNfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uQkMuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IEJDX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCmBgYHtyIFJlc3VsdHMgQkN9CmxpYnJhcnkodGliYmxlKQpCQy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oQkMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhCQy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIEJDLm1hcmtlcnNbQkMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIEJDOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkJDLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgoKIyMjIyBNYXN0IGNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIG1hc3QgY2VsbCBjb21tdW5pdGllcyAoX0tJVF88c3VwPis8L3N1cD4pLCBhbmQgYWxsIG90aGVyIGNvbW11bml0aWVzLgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIE1hc3QgY2FsY3VsYXRlfQpOX0dFTkVTPTIwNTUyCk1DLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiS0lUKyBNQyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0QxNCtDRDY4KyBNIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSUkgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrIFRyZWciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5DQU0xKyBOSyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIktJVCsgTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIElJIikpCgpEVDo6ZGF0YXRhYmxlKE1DLm1hcmtlcnMpCmBgYAoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBNYXN0LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpNQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKE1DLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhNQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIk1hc3QgY2VsbCBtYXJrZXJzXG4oTWFzdCBjZWxsIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCk1DX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLk1DLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBNQ19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgpgYGB7ciBSZXN1bHRzIE1DfQpsaWJyYXJ5KHRpYmJsZSkKTUMubWFya2VycyA8LSBhZGRfY29sdW1uKE1DLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoTUMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBNQy5tYXJrZXJzW01DLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBNQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5NQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKCiMjIyMgTkstY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgbmF0dXJhbCBraWxsZXIgY2VsbCBjb21tdW5pdGllcyAoX05DQU0xXzxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIgY29tbXVuaXRpZXMuCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTksgY2FsY3VsYXRlfQpOX0dFTkVTPTIwNTUyCk5LLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiTkNBTTErIE5LIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSSAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMysgVHJlZyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJIiwgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIk5DQU0xKyBOSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSUkiKSkKCkRUOjpkYXRhdGFibGUoTksubWFya2VycykKYGBgCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIE5LLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpOS19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKE5LLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhOSy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIk5LIG1hcmtlcnNcbihOSy1jZWxsIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHMgPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCk5LX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLk5LLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBOS19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgpgYGB7ciBSZXN1bHRzIE5LfQpsaWJyYXJ5KHRpYmJsZSkKTksubWFya2VycyA8LSBhZGRfY29sdW1uKE5LLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoTksubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBOSy5tYXJrZXJzW05LLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBOSzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5OSy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIyBNaXhlZCBjZWxscwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBtaXhlZCBjZWxsIGNvbW11bml0aWVzLCBhbmQgYWxsIG90aGVyIGNvbW11bml0aWVzLgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIE1JWEVEIGNhbGN1bGF0ZX0KTl9HRU5FUz0yMDU1MgpNSVhFRC5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHNjUk5Bc2VxRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSUkiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNEMTQrQ0Q2OCsgTSBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUlJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzKyBUcmVnIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIEkiLCAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJNaXhlZCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQ1RBMisgU01DIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5DQU0xKyBOSyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJSSIpKQoKRFQ6OmRhdGF0YWJsZShNSVhFRC5tYXJrZXJzKQpgYGAKCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTUlYRUQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Ck1JWEVEX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oTUlYRUQubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKE1JWEVELm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiTWl4ZWQgbWFya2Vyc1xuKE1peGVkIGNlbGwgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvTl9HRU5FUywgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscyA9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKTUlYRURfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uTUlYRUQuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IE1JWEVEX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCmBgYHtyIFJlc3VsdHMgTUlYRUR9CmxpYnJhcnkodGliYmxlKQpNSVhFRC5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oTUlYRUQubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhNSVhFRC5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIE1JWEVELm1hcmtlcnNbTUlYRUQubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIE1JWEVEOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLk1JWEVELkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgoKIyBUb3AgaGl0cwoKRG90cGxvdHMgb2Yga25vd24gYW5kIG5vdmVsIGdlbmVzLgoKU29tZSBnZW5lcyB3ZXJlIG5vdCBmb3VuZCBpbiBvdXIgZGF0YS4KCi0gRE1SVEExIChrbm93bikKLSBMSU5DMDA4NDEgKG5vdmVsKQotIExPQzEwMDEzMDUzOSAobm92ZWwpCgpgYGB7cn0KbGlicmFyeShSQ29sb3JCcmV3ZXIpCiMgIkM2b3JmMTk1IiAgICAgIkVETjEiICAgICAgICAgIlBIQUNUUjEiICAgICAgIlRCQzFENyIgICAgICAgIkdGT0QxIiAgICAgICAgIkVOUFAxIiAgICAgICAgIkVOUFAzIiAgICAgICAgIklHRkJQMyIgICAgICAKIyAiQUMwMTEyOTQuMyIgICAiTVRBUCIgICAgICAgICAiUlAxMS0xNDVFNS41IiAiQzlvcmY1MyIgICAgICAiQ0RLTjJBIiAgICAgICAiQ0RLTjJCIiAgICAgICAiWk5GNDg1IiAgICAgICAiWk5GMzIiICAgICAgIAojICJBTDEzNzAyNi4xIiAgICJBUklENUIiICAgICAgICJSVEtOMiIgICAgICAgICJDQU1LMkciICAgICAgICJWQ0wiICAgICAgICAgICJBUDNNMSIgICAgICAgICJBREsiICAgICAgICAgICJLQVQ2QiIgICAgICAgCiMgIkRVUEQxIiAgICAgICAgIkRVU1AxMyIgICAgICAgIlNBTUQ4IiAgICAgICAgIlZEQUMyIiAgICAgICAgIkNPTVREMSIgICAgICAgIkZHRjIzIiAgICAgICAgIkNPTDRBMSIgICAgICAgIkNPTDRBMiIgICAgICAKIyAiQ0hSTkE1IiAgICAgICAiQ0hSTkI0IiAgICAgICAiQURBTVRTNyIgICAgICAiTU9SRjRMMSIgICAgICAiQ1RTSCIgICAgICAgICAiQkNBTSIgICAgICAgICAiUFZSTDIiICAgICAgICAiVE9NTTQwIiAgICAgIAojICJBUE9FIiAgICAgICAgICJBUE9DMSIgICAgICAgCgp0b3BoaXRzX2tub3duIDwtIGMoIlBIQUNUUjEiLCAiQ0RLTjJCLUFTMSIsIkFQT0UiKSAjIERNUlRBMSBub3QgZm91bmQgaW4gdGhlIGRhdGEKdG9waGl0c19ub3ZlbCA8LSBjKCJFTlBQMyIsICJFTlBQMSIsICJJR0ZCUDMiLCJBUklENUIiLCJBREsiLCAiRkdGMjMiLCAiQ09MNEEyIiwgIkFEQU1UUzciLCAiTU9SRjRMMSIpICMgIkxJTkMwMDg0MSIsICJMT0MxMDAxMzA1MzkiIG5vdCBmb3VuZCBpbiB0aGUgZGF0YQoKCnAxIDwtIERvdFBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IHRvcGhpdHNfa25vd24sCiAgICAgICAgY29scyA9ICJSZEJ1IikKCnAxICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MSwgc2l6ZSA9IDUpKQoKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Eb3RQbG90LlRvcEhpdHMua25vd24ucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Eb3RQbG90LlRvcEhpdHMua25vd24ucHMiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKcm0ocDEpCgpwMSA8LSBEb3RQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSB0b3BoaXRzX25vdmVsLAogICAgICAgIGNvbHMgPSAiUmRCdSIpCgpwMSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0PTEsIHNpemUgPSA1KSkKCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuRG90UGxvdC5Ub3BIaXRzLm5vdmVsLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuRG90UGxvdC5Ub3BIaXRzLm5vdmVsLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKCnJtKHAxKQoKCmBgYAoKCiMgU2Vzc2lvbiBpbmZvcm1hdGlvbgoKLS0tLS0tCgogICAgVmVyc2lvbjogICAgICB2MS4wLjIKICAgIExhc3QgdXBkYXRlOiAgMjAyMS0wNy0xNQogICAgV3JpdHRlbiBieTogICBTYW5kZXIgVy4gdmFuIGRlciBMYWFuIChzLncudmFuZGVybGFhbi0yW2F0XXVtY3V0cmVjaHQubmwpLgogICAgRGVzY3JpcHRpb246ICBTY3JpcHQgdG8gbG9hZCBzaW5nbGUtY2VsbCBSTkEgc2VxdWVuY2luZyAoc2NSTkFzZXEpIGRhdGEsIGFuZCBwZXJmb3JtIHF1YWxpdHkgY29udHJvbCAoUUMpLCBhbmQgaW5pdGlhbCBtYXBwaW5nIHRvIGNlbGxzLgogICAgTWluaW11bSByZXF1aXJlbWVudHM6IFIgdmVyc2lvbiAzLjUuMiAoMjAxOC0xMi0yMCkgLS0gJ0VnZ3NoZWxsIElnbG9vJywgbWFjT1MgTW9qYXZlICgxMC4xNC4yKS4KICAgIAogICAgQ2hhbmdlIGxvZwogICAgKiB2MS4wLjIgVXBkYXRlIHRvIHRoZSBnZW5lIGxpc3QsIHdvcmtmbG93LCBhbmQgZGF0YXNldC4KICAgICogdjEuMC4xIFVwZGF0ZSB0byB0aGUgZ2VuZSBsaXN0LgogICAgKiB2MS4wLjAgSW5pdGlhbCB2ZXJzaW9uCgotLS0tLS0KCmBgYHtyIGV2YWwgPSBUUlVFfQpzZXNzaW9uSW5mbygpCmBgYAoKIyBTYXZpbmcgZW52aXJvbm1lbnQKYGBge3IgU2F2aW5nfQpzYXZlLmltYWdlKHBhc3RlMChQUk9KRUNUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLnNjcm5hc2VxX3Jlc3VsdHMuUkRhdGEiKSkKYGBgCgotLS0tLS0KPHN1cD4mY29weTsgMTk3OS0yMDIxIFNhbmRlciBXLiB2YW4gZGVyIExhYW4gfCBzLncudmFuZGVybGFhbi0yW2F0XXVtY3V0cmVjaHQubmwgfCBbc3d2YW5kZXJsYWFuLmdpdGh1Yi5pb10oaHR0cHM6Ly9zd3ZhbmRlcmxhYW4uZ2l0aHViLmlvKS48L3N1cD4KLS0tLS0tCgo=